diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i - - + diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i - - + diff --git a/examples/example 13 - Graphics/pixi.js b/examples/example 13 - Graphics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 13 - Graphics/pixi.js +++ b/examples/example 13 - Graphics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i - - + diff --git a/examples/example 13 - Graphics/pixi.js b/examples/example 13 - Graphics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 13 - Graphics/pixi.js +++ b/examples/example 13 - Graphics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i - - + diff --git a/examples/example 13 - Graphics/pixi.js b/examples/example 13 - Graphics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 13 - Graphics/pixi.js +++ b/examples/example 13 - Graphics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i - - + diff --git a/examples/example 13 - Graphics/pixi.js b/examples/example 13 - Graphics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 13 - Graphics/pixi.js +++ b/examples/example 13 - Graphics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i - - + diff --git a/examples/example 13 - Graphics/pixi.js b/examples/example 13 - Graphics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 13 - Graphics/pixi.js +++ b/examples/example 13 - Graphics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i - - + diff --git a/examples/example 13 - Graphics/pixi.js b/examples/example 13 - Graphics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 13 - Graphics/pixi.js +++ b/examples/example 13 - Graphics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i - - + diff --git a/examples/example 13 - Graphics/pixi.js b/examples/example 13 - Graphics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 13 - Graphics/pixi.js +++ b/examples/example 13 - Graphics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i - - + diff --git a/examples/example 13 - Graphics/pixi.js b/examples/example 13 - Graphics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 13 - Graphics/pixi.js +++ b/examples/example 13 - Graphics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i - - + diff --git a/examples/example 13 - Graphics/pixi.js b/examples/example 13 - Graphics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 13 - Graphics/pixi.js +++ b/examples/example 13 - Graphics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i - - + diff --git a/examples/example 13 - Graphics/pixi.js b/examples/example 13 - Graphics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 13 - Graphics/pixi.js +++ b/examples/example 13 - Graphics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i - - + diff --git a/examples/example 13 - Graphics/pixi.js b/examples/example 13 - Graphics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 13 - Graphics/pixi.js +++ b/examples/example 13 - Graphics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i - - + diff --git a/examples/example 13 - Graphics/pixi.js b/examples/example 13 - Graphics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 13 - Graphics/pixi.js +++ b/examples/example 13 - Graphics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i - - + diff --git a/examples/example 13 - Graphics/pixi.js b/examples/example 13 - Graphics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 13 - Graphics/pixi.js +++ b/examples/example 13 - Graphics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i - - + diff --git a/examples/example 13 - Graphics/pixi.js b/examples/example 13 - Graphics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 13 - Graphics/pixi.js +++ b/examples/example 13 - Graphics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i - - + diff --git a/examples/example 13 - Graphics/pixi.js b/examples/example 13 - Graphics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 13 - Graphics/pixi.js +++ b/examples/example 13 - Graphics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -72,21 +88,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -106,16 +125,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -130,8 +148,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -155,9 +173,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -170,26 +189,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -198,8 +215,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -209,6 +226,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -233,12 +252,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -248,7 +274,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -256,12 +283,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -274,27 +298,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -309,18 +350,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -329,22 +372,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -352,92 +443,5 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} - -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i - - + diff --git a/examples/example 13 - Graphics/pixi.js b/examples/example 13 - Graphics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 13 - Graphics/pixi.js +++ b/examples/example 13 - Graphics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -72,21 +88,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -106,16 +125,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -130,8 +148,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -155,9 +173,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -170,26 +189,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -198,8 +215,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -209,6 +226,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -233,12 +252,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -248,7 +274,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -256,12 +283,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -274,27 +298,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -309,18 +350,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -329,22 +372,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -352,92 +443,5 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} - -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} diff --git a/src/pixi/renderers/webgl/WebGLRenderGroup.js b/src/pixi/renderers/webgl/WebGLRenderGroup.js index a193406..ba26f06 100644 --- a/src/pixi/renderers/webgl/WebGLRenderGroup.js +++ b/src/pixi/renderers/webgl/WebGLRenderGroup.js @@ -43,15 +43,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -68,28 +70,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -171,28 +175,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -206,22 +197,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -231,21 +211,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -254,17 +222,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -518,6 +494,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -753,7 +730,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -789,17 +765,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -828,8 +813,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -855,11 +838,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i - - + diff --git a/examples/example 13 - Graphics/pixi.js b/examples/example 13 - Graphics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 13 - Graphics/pixi.js +++ b/examples/example 13 - Graphics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -72,21 +88,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -106,16 +125,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -130,8 +148,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -155,9 +173,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -170,26 +189,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -198,8 +215,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -209,6 +226,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -233,12 +252,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -248,7 +274,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -256,12 +283,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -274,27 +298,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -309,18 +350,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -329,22 +372,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -352,92 +443,5 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} - -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} diff --git a/src/pixi/renderers/webgl/WebGLRenderGroup.js b/src/pixi/renderers/webgl/WebGLRenderGroup.js index a193406..ba26f06 100644 --- a/src/pixi/renderers/webgl/WebGLRenderGroup.js +++ b/src/pixi/renderers/webgl/WebGLRenderGroup.js @@ -43,15 +43,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -68,28 +70,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -171,28 +175,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -206,22 +197,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -231,21 +211,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -254,17 +222,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -518,6 +494,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -753,7 +730,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -789,17 +765,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -828,8 +813,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -855,11 +838,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } diff --git a/src/pixi/renderers/webgl/WebGLRenderer.js b/src/pixi/renderers/webgl/WebGLRenderer.js index 7b43b52..112407c 100644 --- a/src/pixi/renderers/webgl/WebGLRenderer.js +++ b/src/pixi/renderers/webgl/WebGLRenderer.js @@ -56,8 +56,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -68,7 +71,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -106,38 +110,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -186,7 +159,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -194,10 +167,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -298,12 +271,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i - - + diff --git a/examples/example 13 - Graphics/pixi.js b/examples/example 13 - Graphics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 13 - Graphics/pixi.js +++ b/examples/example 13 - Graphics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -72,21 +88,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -106,16 +125,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -130,8 +148,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -155,9 +173,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -170,26 +189,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -198,8 +215,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -209,6 +226,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -233,12 +252,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -248,7 +274,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -256,12 +283,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -274,27 +298,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -309,18 +350,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -329,22 +372,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -352,92 +443,5 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} - -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} diff --git a/src/pixi/renderers/webgl/WebGLRenderGroup.js b/src/pixi/renderers/webgl/WebGLRenderGroup.js index a193406..ba26f06 100644 --- a/src/pixi/renderers/webgl/WebGLRenderGroup.js +++ b/src/pixi/renderers/webgl/WebGLRenderGroup.js @@ -43,15 +43,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -68,28 +70,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -171,28 +175,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -206,22 +197,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -231,21 +211,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -254,17 +222,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -518,6 +494,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -753,7 +730,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -789,17 +765,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -828,8 +813,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -855,11 +838,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } diff --git a/src/pixi/renderers/webgl/WebGLRenderer.js b/src/pixi/renderers/webgl/WebGLRenderer.js index 7b43b52..112407c 100644 --- a/src/pixi/renderers/webgl/WebGLRenderer.js +++ b/src/pixi/renderers/webgl/WebGLRenderer.js @@ -56,8 +56,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -68,7 +71,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -106,38 +110,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -186,7 +159,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -194,10 +167,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -298,12 +271,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** diff --git a/src/pixi/renderers/webgl/WebGLShaders.js b/src/pixi/renderers/webgl/WebGLShaders.js index 139ede9..2ba3c51 100644 --- a/src/pixi/renderers/webgl/WebGLShaders.js +++ b/src/pixi/renderers/webgl/WebGLShaders.js @@ -3,6 +3,11 @@ * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -18,20 +23,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -70,6 +172,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -77,12 +198,9 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i - - + diff --git a/examples/example 13 - Graphics/pixi.js b/examples/example 13 - Graphics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 13 - Graphics/pixi.js +++ b/examples/example 13 - Graphics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -72,21 +88,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -106,16 +125,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -130,8 +148,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -155,9 +173,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -170,26 +189,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -198,8 +215,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -209,6 +226,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -233,12 +252,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -248,7 +274,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -256,12 +283,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -274,27 +298,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -309,18 +350,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -329,22 +372,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -352,92 +443,5 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} - -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} diff --git a/src/pixi/renderers/webgl/WebGLRenderGroup.js b/src/pixi/renderers/webgl/WebGLRenderGroup.js index a193406..ba26f06 100644 --- a/src/pixi/renderers/webgl/WebGLRenderGroup.js +++ b/src/pixi/renderers/webgl/WebGLRenderGroup.js @@ -43,15 +43,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -68,28 +70,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -171,28 +175,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -206,22 +197,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -231,21 +211,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -254,17 +222,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -518,6 +494,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -753,7 +730,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -789,17 +765,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -828,8 +813,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -855,11 +838,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } diff --git a/src/pixi/renderers/webgl/WebGLRenderer.js b/src/pixi/renderers/webgl/WebGLRenderer.js index 7b43b52..112407c 100644 --- a/src/pixi/renderers/webgl/WebGLRenderer.js +++ b/src/pixi/renderers/webgl/WebGLRenderer.js @@ -56,8 +56,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -68,7 +71,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -106,38 +110,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -186,7 +159,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -194,10 +167,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -298,12 +271,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** diff --git a/src/pixi/renderers/webgl/WebGLShaders.js b/src/pixi/renderers/webgl/WebGLShaders.js index 139ede9..2ba3c51 100644 --- a/src/pixi/renderers/webgl/WebGLShaders.js +++ b/src/pixi/renderers/webgl/WebGLShaders.js @@ -3,6 +3,11 @@ * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -18,20 +23,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -70,6 +172,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -77,12 +198,9 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/src/pixi/textures/RenderTexture.js b/src/pixi/textures/RenderTexture.js index 3c13ad6..537cd94 100644 --- a/src/pixi/textures/RenderTexture.js +++ b/src/pixi/textures/RenderTexture.js @@ -65,6 +65,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -115,6 +117,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i - - + diff --git a/examples/example 13 - Graphics/pixi.js b/examples/example 13 - Graphics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 13 - Graphics/pixi.js +++ b/examples/example 13 - Graphics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -72,21 +88,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -106,16 +125,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -130,8 +148,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -155,9 +173,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -170,26 +189,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -198,8 +215,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -209,6 +226,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -233,12 +252,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -248,7 +274,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -256,12 +283,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -274,27 +298,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -309,18 +350,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -329,22 +372,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -352,92 +443,5 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} - -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} diff --git a/src/pixi/renderers/webgl/WebGLRenderGroup.js b/src/pixi/renderers/webgl/WebGLRenderGroup.js index a193406..ba26f06 100644 --- a/src/pixi/renderers/webgl/WebGLRenderGroup.js +++ b/src/pixi/renderers/webgl/WebGLRenderGroup.js @@ -43,15 +43,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -68,28 +70,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -171,28 +175,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -206,22 +197,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -231,21 +211,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -254,17 +222,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -518,6 +494,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -753,7 +730,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -789,17 +765,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -828,8 +813,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -855,11 +838,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } diff --git a/src/pixi/renderers/webgl/WebGLRenderer.js b/src/pixi/renderers/webgl/WebGLRenderer.js index 7b43b52..112407c 100644 --- a/src/pixi/renderers/webgl/WebGLRenderer.js +++ b/src/pixi/renderers/webgl/WebGLRenderer.js @@ -56,8 +56,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -68,7 +71,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -106,38 +110,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -186,7 +159,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -194,10 +167,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -298,12 +271,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** diff --git a/src/pixi/renderers/webgl/WebGLShaders.js b/src/pixi/renderers/webgl/WebGLShaders.js index 139ede9..2ba3c51 100644 --- a/src/pixi/renderers/webgl/WebGLShaders.js +++ b/src/pixi/renderers/webgl/WebGLShaders.js @@ -3,6 +3,11 @@ * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -18,20 +23,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -70,6 +172,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -77,12 +198,9 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/src/pixi/textures/RenderTexture.js b/src/pixi/textures/RenderTexture.js index 3c13ad6..537cd94 100644 --- a/src/pixi/textures/RenderTexture.js +++ b/src/pixi/textures/RenderTexture.js @@ -65,6 +65,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -115,6 +117,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + \ No newline at end of file diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i - - + diff --git a/examples/example 13 - Graphics/pixi.js b/examples/example 13 - Graphics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 13 - Graphics/pixi.js +++ b/examples/example 13 - Graphics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -72,21 +88,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -106,16 +125,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -130,8 +148,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -155,9 +173,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -170,26 +189,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -198,8 +215,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -209,6 +226,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -233,12 +252,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -248,7 +274,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -256,12 +283,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -274,27 +298,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -309,18 +350,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -329,22 +372,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -352,92 +443,5 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} - -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} diff --git a/src/pixi/renderers/webgl/WebGLRenderGroup.js b/src/pixi/renderers/webgl/WebGLRenderGroup.js index a193406..ba26f06 100644 --- a/src/pixi/renderers/webgl/WebGLRenderGroup.js +++ b/src/pixi/renderers/webgl/WebGLRenderGroup.js @@ -43,15 +43,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -68,28 +70,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -171,28 +175,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -206,22 +197,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -231,21 +211,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -254,17 +222,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -518,6 +494,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -753,7 +730,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -789,17 +765,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -828,8 +813,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -855,11 +838,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } diff --git a/src/pixi/renderers/webgl/WebGLRenderer.js b/src/pixi/renderers/webgl/WebGLRenderer.js index 7b43b52..112407c 100644 --- a/src/pixi/renderers/webgl/WebGLRenderer.js +++ b/src/pixi/renderers/webgl/WebGLRenderer.js @@ -56,8 +56,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -68,7 +71,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -106,38 +110,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -186,7 +159,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -194,10 +167,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -298,12 +271,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** diff --git a/src/pixi/renderers/webgl/WebGLShaders.js b/src/pixi/renderers/webgl/WebGLShaders.js index 139ede9..2ba3c51 100644 --- a/src/pixi/renderers/webgl/WebGLShaders.js +++ b/src/pixi/renderers/webgl/WebGLShaders.js @@ -3,6 +3,11 @@ * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -18,20 +23,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -70,6 +172,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -77,12 +198,9 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/src/pixi/textures/RenderTexture.js b/src/pixi/textures/RenderTexture.js index 3c13ad6..537cd94 100644 --- a/src/pixi/textures/RenderTexture.js +++ b/src/pixi/textures/RenderTexture.js @@ -65,6 +65,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -115,6 +117,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + \ No newline at end of file diff --git a/src/pixi/utils/pixi.js example 13 - Graphics.html b/src/pixi/utils/pixi.js example 13 - Graphics.html new file mode 100644 index 0000000..3115e6c --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics.html @@ -0,0 +1,203 @@ + + + + pixi.js example 13 - Graphics + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i - - + diff --git a/examples/example 13 - Graphics/pixi.js b/examples/example 13 - Graphics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 13 - Graphics/pixi.js +++ b/examples/example 13 - Graphics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -72,21 +88,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -106,16 +125,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -130,8 +148,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -155,9 +173,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -170,26 +189,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -198,8 +215,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -209,6 +226,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -233,12 +252,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -248,7 +274,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -256,12 +283,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -274,27 +298,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -309,18 +350,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -329,22 +372,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -352,92 +443,5 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} - -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} diff --git a/src/pixi/renderers/webgl/WebGLRenderGroup.js b/src/pixi/renderers/webgl/WebGLRenderGroup.js index a193406..ba26f06 100644 --- a/src/pixi/renderers/webgl/WebGLRenderGroup.js +++ b/src/pixi/renderers/webgl/WebGLRenderGroup.js @@ -43,15 +43,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -68,28 +70,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -171,28 +175,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -206,22 +197,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -231,21 +211,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -254,17 +222,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -518,6 +494,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -753,7 +730,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -789,17 +765,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -828,8 +813,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -855,11 +838,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } diff --git a/src/pixi/renderers/webgl/WebGLRenderer.js b/src/pixi/renderers/webgl/WebGLRenderer.js index 7b43b52..112407c 100644 --- a/src/pixi/renderers/webgl/WebGLRenderer.js +++ b/src/pixi/renderers/webgl/WebGLRenderer.js @@ -56,8 +56,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -68,7 +71,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -106,38 +110,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -186,7 +159,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -194,10 +167,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -298,12 +271,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** diff --git a/src/pixi/renderers/webgl/WebGLShaders.js b/src/pixi/renderers/webgl/WebGLShaders.js index 139ede9..2ba3c51 100644 --- a/src/pixi/renderers/webgl/WebGLShaders.js +++ b/src/pixi/renderers/webgl/WebGLShaders.js @@ -3,6 +3,11 @@ * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -18,20 +23,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -70,6 +172,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -77,12 +198,9 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/src/pixi/textures/RenderTexture.js b/src/pixi/textures/RenderTexture.js index 3c13ad6..537cd94 100644 --- a/src/pixi/textures/RenderTexture.js +++ b/src/pixi/textures/RenderTexture.js @@ -65,6 +65,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -115,6 +117,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + \ No newline at end of file diff --git a/src/pixi/utils/pixi.js example 13 - Graphics.html b/src/pixi/utils/pixi.js example 13 - Graphics.html new file mode 100644 index 0000000..3115e6c --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics.html @@ -0,0 +1,203 @@ + + + + pixi.js example 13 - Graphics + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasGraphics.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasGraphics.js new file mode 100644 index 0000000..ac9c961 --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasGraphics.js @@ -0,0 +1,129 @@ +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + +/** + * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. + * @class DisplayObjectContainer + * @extends DisplayObject + * @constructor + */ +PIXI.CanvasGraphics = function() +{ + +} + +// constructor + +PIXI.CanvasGraphics.renderGraphics = function(graphics, context) +{ + + for (var i=0; i < graphics.graphicsData.length; i++) + { + var data = graphics.graphicsData[i]; + var points = data.points; + + context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); + + context.lineWidth = data.lineWidth; + context.globalAlpha = data.lineAlpha; + + if(data.type == PIXI.Graphics.POLY) + { + if(data.lineWidth <= 0)continue; + + context.beginPath(); + + context.moveTo(points[0], points[1]); + + for (var j=1; j < points.length/2; j++) + { + context.lineTo(points[j * 2], points[j * 2 + 1]); + } + + // if the first and last point are the same close the path - much neater :) + if(points[0] == points[points.length-2] && points[1] == points[points.length-1]) + { + context.closePath(); + } + + context.stroke(); + } + else if(data.type == PIXI.Graphics.RECT) + { + // TODO - need to be Undefined! + if(data.fillColor) + { + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + + context.fillRect(points[0], points[1], points[2], points[3]); + + } + if(data.lineWidth) + { + context.strokeRect(points[0], points[1], points[2], points[3]); + } + } + else if(data.type == PIXI.Graphics.CIRC) + { + // TODO - need to be Undefined! + context.beginPath(); + context.arc(points[0], points[1], points[2],0,2*Math.PI); + context.closePath(); + + if(data.fill) + { + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.stroke(); + } + } + + + }; +} diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i - - + diff --git a/examples/example 13 - Graphics/pixi.js b/examples/example 13 - Graphics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 13 - Graphics/pixi.js +++ b/examples/example 13 - Graphics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -72,21 +88,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -106,16 +125,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -130,8 +148,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -155,9 +173,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -170,26 +189,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -198,8 +215,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -209,6 +226,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -233,12 +252,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -248,7 +274,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -256,12 +283,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -274,27 +298,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -309,18 +350,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -329,22 +372,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -352,92 +443,5 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} - -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} diff --git a/src/pixi/renderers/webgl/WebGLRenderGroup.js b/src/pixi/renderers/webgl/WebGLRenderGroup.js index a193406..ba26f06 100644 --- a/src/pixi/renderers/webgl/WebGLRenderGroup.js +++ b/src/pixi/renderers/webgl/WebGLRenderGroup.js @@ -43,15 +43,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -68,28 +70,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -171,28 +175,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -206,22 +197,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -231,21 +211,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -254,17 +222,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -518,6 +494,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -753,7 +730,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -789,17 +765,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -828,8 +813,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -855,11 +838,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } diff --git a/src/pixi/renderers/webgl/WebGLRenderer.js b/src/pixi/renderers/webgl/WebGLRenderer.js index 7b43b52..112407c 100644 --- a/src/pixi/renderers/webgl/WebGLRenderer.js +++ b/src/pixi/renderers/webgl/WebGLRenderer.js @@ -56,8 +56,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -68,7 +71,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -106,38 +110,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -186,7 +159,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -194,10 +167,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -298,12 +271,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** diff --git a/src/pixi/renderers/webgl/WebGLShaders.js b/src/pixi/renderers/webgl/WebGLShaders.js index 139ede9..2ba3c51 100644 --- a/src/pixi/renderers/webgl/WebGLShaders.js +++ b/src/pixi/renderers/webgl/WebGLShaders.js @@ -3,6 +3,11 @@ * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -18,20 +23,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -70,6 +172,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -77,12 +198,9 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/src/pixi/textures/RenderTexture.js b/src/pixi/textures/RenderTexture.js index 3c13ad6..537cd94 100644 --- a/src/pixi/textures/RenderTexture.js +++ b/src/pixi/textures/RenderTexture.js @@ -65,6 +65,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -115,6 +117,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + \ No newline at end of file diff --git a/src/pixi/utils/pixi.js example 13 - Graphics.html b/src/pixi/utils/pixi.js example 13 - Graphics.html new file mode 100644 index 0000000..3115e6c --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics.html @@ -0,0 +1,203 @@ + + + + pixi.js example 13 - Graphics + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasGraphics.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasGraphics.js new file mode 100644 index 0000000..ac9c961 --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasGraphics.js @@ -0,0 +1,129 @@ +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + +/** + * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. + * @class DisplayObjectContainer + * @extends DisplayObject + * @constructor + */ +PIXI.CanvasGraphics = function() +{ + +} + +// constructor + +PIXI.CanvasGraphics.renderGraphics = function(graphics, context) +{ + + for (var i=0; i < graphics.graphicsData.length; i++) + { + var data = graphics.graphicsData[i]; + var points = data.points; + + context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); + + context.lineWidth = data.lineWidth; + context.globalAlpha = data.lineAlpha; + + if(data.type == PIXI.Graphics.POLY) + { + if(data.lineWidth <= 0)continue; + + context.beginPath(); + + context.moveTo(points[0], points[1]); + + for (var j=1; j < points.length/2; j++) + { + context.lineTo(points[j * 2], points[j * 2 + 1]); + } + + // if the first and last point are the same close the path - much neater :) + if(points[0] == points[points.length-2] && points[1] == points[points.length-1]) + { + context.closePath(); + } + + context.stroke(); + } + else if(data.type == PIXI.Graphics.RECT) + { + // TODO - need to be Undefined! + if(data.fillColor) + { + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + + context.fillRect(points[0], points[1], points[2], points[3]); + + } + if(data.lineWidth) + { + context.strokeRect(points[0], points[1], points[2], points[3]); + } + } + else if(data.type == PIXI.Graphics.CIRC) + { + // TODO - need to be Undefined! + context.beginPath(); + context.arc(points[0], points[1], points[2],0,2*Math.PI); + context.closePath(); + + if(data.fill) + { + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.stroke(); + } + } + + + }; +} diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasRenderer.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasRenderer.js new file mode 100644 index 0000000..7cb832c --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasRenderer.js @@ -0,0 +1 @@ +

File /pixi.js/src/pixi/renderers/CanvasRenderer.js not found

\ No newline at end of file diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i - - + diff --git a/examples/example 13 - Graphics/pixi.js b/examples/example 13 - Graphics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 13 - Graphics/pixi.js +++ b/examples/example 13 - Graphics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -72,21 +88,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -106,16 +125,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -130,8 +148,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -155,9 +173,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -170,26 +189,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -198,8 +215,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -209,6 +226,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -233,12 +252,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -248,7 +274,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -256,12 +283,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -274,27 +298,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -309,18 +350,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -329,22 +372,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -352,92 +443,5 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} - -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} diff --git a/src/pixi/renderers/webgl/WebGLRenderGroup.js b/src/pixi/renderers/webgl/WebGLRenderGroup.js index a193406..ba26f06 100644 --- a/src/pixi/renderers/webgl/WebGLRenderGroup.js +++ b/src/pixi/renderers/webgl/WebGLRenderGroup.js @@ -43,15 +43,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -68,28 +70,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -171,28 +175,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -206,22 +197,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -231,21 +211,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -254,17 +222,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -518,6 +494,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -753,7 +730,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -789,17 +765,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -828,8 +813,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -855,11 +838,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } diff --git a/src/pixi/renderers/webgl/WebGLRenderer.js b/src/pixi/renderers/webgl/WebGLRenderer.js index 7b43b52..112407c 100644 --- a/src/pixi/renderers/webgl/WebGLRenderer.js +++ b/src/pixi/renderers/webgl/WebGLRenderer.js @@ -56,8 +56,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -68,7 +71,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -106,38 +110,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -186,7 +159,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -194,10 +167,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -298,12 +271,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** diff --git a/src/pixi/renderers/webgl/WebGLShaders.js b/src/pixi/renderers/webgl/WebGLShaders.js index 139ede9..2ba3c51 100644 --- a/src/pixi/renderers/webgl/WebGLShaders.js +++ b/src/pixi/renderers/webgl/WebGLShaders.js @@ -3,6 +3,11 @@ * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -18,20 +23,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -70,6 +172,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -77,12 +198,9 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/src/pixi/textures/RenderTexture.js b/src/pixi/textures/RenderTexture.js index 3c13ad6..537cd94 100644 --- a/src/pixi/textures/RenderTexture.js +++ b/src/pixi/textures/RenderTexture.js @@ -65,6 +65,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -115,6 +117,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + \ No newline at end of file diff --git a/src/pixi/utils/pixi.js example 13 - Graphics.html b/src/pixi/utils/pixi.js example 13 - Graphics.html new file mode 100644 index 0000000..3115e6c --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics.html @@ -0,0 +1,203 @@ + + + + pixi.js example 13 - Graphics + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasGraphics.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasGraphics.js new file mode 100644 index 0000000..ac9c961 --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasGraphics.js @@ -0,0 +1,129 @@ +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + +/** + * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. + * @class DisplayObjectContainer + * @extends DisplayObject + * @constructor + */ +PIXI.CanvasGraphics = function() +{ + +} + +// constructor + +PIXI.CanvasGraphics.renderGraphics = function(graphics, context) +{ + + for (var i=0; i < graphics.graphicsData.length; i++) + { + var data = graphics.graphicsData[i]; + var points = data.points; + + context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); + + context.lineWidth = data.lineWidth; + context.globalAlpha = data.lineAlpha; + + if(data.type == PIXI.Graphics.POLY) + { + if(data.lineWidth <= 0)continue; + + context.beginPath(); + + context.moveTo(points[0], points[1]); + + for (var j=1; j < points.length/2; j++) + { + context.lineTo(points[j * 2], points[j * 2 + 1]); + } + + // if the first and last point are the same close the path - much neater :) + if(points[0] == points[points.length-2] && points[1] == points[points.length-1]) + { + context.closePath(); + } + + context.stroke(); + } + else if(data.type == PIXI.Graphics.RECT) + { + // TODO - need to be Undefined! + if(data.fillColor) + { + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + + context.fillRect(points[0], points[1], points[2], points[3]); + + } + if(data.lineWidth) + { + context.strokeRect(points[0], points[1], points[2], points[3]); + } + } + else if(data.type == PIXI.Graphics.CIRC) + { + // TODO - need to be Undefined! + context.beginPath(); + context.arc(points[0], points[1], points[2],0,2*Math.PI); + context.closePath(); + + if(data.fill) + { + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.stroke(); + } + } + + + }; +} diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasRenderer.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasRenderer.js new file mode 100644 index 0000000..7cb832c --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasRenderer.js @@ -0,0 +1 @@ +

File /pixi.js/src/pixi/renderers/CanvasRenderer.js not found

\ No newline at end of file diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/Graphics.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/Graphics.js new file mode 100644 index 0000000..a6a0667 --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/Graphics.js @@ -0,0 +1,163 @@ +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + +/** + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer + * @constructor + */ +PIXI.Graphics = function() +{ + PIXI.DisplayObjectContainer.call( this ); + + this.renderable = true; + + this.fillAlpha = 1; + + this.lineWidth = 2; + this.lineColor = "#FF0000"; + + this.graphicsData = []; + +} + +// constructor +PIXI.Graphics.constructor = PIXI.Graphics; +PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); + +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ +PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) +{ + this.lineWidth = lineWidth || 0; + this.lineColor = color || 0; + this.lineAlpha = (alpha == undefined) ? 1 : alpha; + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + this.graphicsData.push(this.currentPath); +} + +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ +PIXI.Graphics.prototype.moveTo = function(x, y) +{ + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + + this.currentPath.points.push(x, y); + + this.graphicsData.push(this.currentPath); +} + +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ +PIXI.Graphics.prototype.lineTo = function(x, y) +{ + this.currentPath.points.push(x, y); + this.dirty = true; +} + +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ +PIXI.Graphics.prototype.beginFill = function(color, alpha) +{ + this.filling = true; + this.fillColor = color || 0; + this.fillAlpha = alpha || 1; +} + +/** + * @method endFill + */ +PIXI.Graphics.prototype.endFill = function() +{ + this.filling = false; + this.fillColor = null; + this.fillAlpha = 1; +} + +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) +{ + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.RECT}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ +PIXI.Graphics.prototype.drawCircle = function( x, y, radius) +{ + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ +PIXI.Graphics.prototype.clear = function() +{ + this.dirty = true; + this.clearDirty = true; + this.graphicsData = []; +} + +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i - - + diff --git a/examples/example 13 - Graphics/pixi.js b/examples/example 13 - Graphics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 13 - Graphics/pixi.js +++ b/examples/example 13 - Graphics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -72,21 +88,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -106,16 +125,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -130,8 +148,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -155,9 +173,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -170,26 +189,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -198,8 +215,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -209,6 +226,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -233,12 +252,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -248,7 +274,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -256,12 +283,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -274,27 +298,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -309,18 +350,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -329,22 +372,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -352,92 +443,5 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} - -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} diff --git a/src/pixi/renderers/webgl/WebGLRenderGroup.js b/src/pixi/renderers/webgl/WebGLRenderGroup.js index a193406..ba26f06 100644 --- a/src/pixi/renderers/webgl/WebGLRenderGroup.js +++ b/src/pixi/renderers/webgl/WebGLRenderGroup.js @@ -43,15 +43,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -68,28 +70,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -171,28 +175,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -206,22 +197,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -231,21 +211,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -254,17 +222,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -518,6 +494,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -753,7 +730,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -789,17 +765,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -828,8 +813,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -855,11 +838,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } diff --git a/src/pixi/renderers/webgl/WebGLRenderer.js b/src/pixi/renderers/webgl/WebGLRenderer.js index 7b43b52..112407c 100644 --- a/src/pixi/renderers/webgl/WebGLRenderer.js +++ b/src/pixi/renderers/webgl/WebGLRenderer.js @@ -56,8 +56,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -68,7 +71,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -106,38 +110,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -186,7 +159,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -194,10 +167,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -298,12 +271,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** diff --git a/src/pixi/renderers/webgl/WebGLShaders.js b/src/pixi/renderers/webgl/WebGLShaders.js index 139ede9..2ba3c51 100644 --- a/src/pixi/renderers/webgl/WebGLShaders.js +++ b/src/pixi/renderers/webgl/WebGLShaders.js @@ -3,6 +3,11 @@ * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -18,20 +23,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -70,6 +172,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -77,12 +198,9 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/src/pixi/textures/RenderTexture.js b/src/pixi/textures/RenderTexture.js index 3c13ad6..537cd94 100644 --- a/src/pixi/textures/RenderTexture.js +++ b/src/pixi/textures/RenderTexture.js @@ -65,6 +65,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -115,6 +117,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + \ No newline at end of file diff --git a/src/pixi/utils/pixi.js example 13 - Graphics.html b/src/pixi/utils/pixi.js example 13 - Graphics.html new file mode 100644 index 0000000..3115e6c --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics.html @@ -0,0 +1,203 @@ + + + + pixi.js example 13 - Graphics + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasGraphics.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasGraphics.js new file mode 100644 index 0000000..ac9c961 --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasGraphics.js @@ -0,0 +1,129 @@ +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + +/** + * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. + * @class DisplayObjectContainer + * @extends DisplayObject + * @constructor + */ +PIXI.CanvasGraphics = function() +{ + +} + +// constructor + +PIXI.CanvasGraphics.renderGraphics = function(graphics, context) +{ + + for (var i=0; i < graphics.graphicsData.length; i++) + { + var data = graphics.graphicsData[i]; + var points = data.points; + + context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); + + context.lineWidth = data.lineWidth; + context.globalAlpha = data.lineAlpha; + + if(data.type == PIXI.Graphics.POLY) + { + if(data.lineWidth <= 0)continue; + + context.beginPath(); + + context.moveTo(points[0], points[1]); + + for (var j=1; j < points.length/2; j++) + { + context.lineTo(points[j * 2], points[j * 2 + 1]); + } + + // if the first and last point are the same close the path - much neater :) + if(points[0] == points[points.length-2] && points[1] == points[points.length-1]) + { + context.closePath(); + } + + context.stroke(); + } + else if(data.type == PIXI.Graphics.RECT) + { + // TODO - need to be Undefined! + if(data.fillColor) + { + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + + context.fillRect(points[0], points[1], points[2], points[3]); + + } + if(data.lineWidth) + { + context.strokeRect(points[0], points[1], points[2], points[3]); + } + } + else if(data.type == PIXI.Graphics.CIRC) + { + // TODO - need to be Undefined! + context.beginPath(); + context.arc(points[0], points[1], points[2],0,2*Math.PI); + context.closePath(); + + if(data.fill) + { + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.stroke(); + } + } + + + }; +} diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasRenderer.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasRenderer.js new file mode 100644 index 0000000..7cb832c --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasRenderer.js @@ -0,0 +1 @@ +

File /pixi.js/src/pixi/renderers/CanvasRenderer.js not found

\ No newline at end of file diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/Graphics.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/Graphics.js new file mode 100644 index 0000000..a6a0667 --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/Graphics.js @@ -0,0 +1,163 @@ +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + +/** + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer + * @constructor + */ +PIXI.Graphics = function() +{ + PIXI.DisplayObjectContainer.call( this ); + + this.renderable = true; + + this.fillAlpha = 1; + + this.lineWidth = 2; + this.lineColor = "#FF0000"; + + this.graphicsData = []; + +} + +// constructor +PIXI.Graphics.constructor = PIXI.Graphics; +PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); + +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ +PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) +{ + this.lineWidth = lineWidth || 0; + this.lineColor = color || 0; + this.lineAlpha = (alpha == undefined) ? 1 : alpha; + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + this.graphicsData.push(this.currentPath); +} + +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ +PIXI.Graphics.prototype.moveTo = function(x, y) +{ + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + + this.currentPath.points.push(x, y); + + this.graphicsData.push(this.currentPath); +} + +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ +PIXI.Graphics.prototype.lineTo = function(x, y) +{ + this.currentPath.points.push(x, y); + this.dirty = true; +} + +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ +PIXI.Graphics.prototype.beginFill = function(color, alpha) +{ + this.filling = true; + this.fillColor = color || 0; + this.fillAlpha = alpha || 1; +} + +/** + * @method endFill + */ +PIXI.Graphics.prototype.endFill = function() +{ + this.filling = false; + this.fillColor = null; + this.fillAlpha = 1; +} + +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) +{ + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.RECT}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ +PIXI.Graphics.prototype.drawCircle = function( x, y, radius) +{ + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ +PIXI.Graphics.prototype.clear = function() +{ + this.dirty = true; + this.clearDirty = true; + this.graphicsData = []; +} + +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/Polyk.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/Polyk.js new file mode 100644 index 0000000..f61d0c6 --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/Polyk.js @@ -0,0 +1,473 @@ + + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + */ + + var PolyK = {}; + + /* + Is Polygon self-intersecting? + + O(n^2) + */ + + PolyK.IsSimple = function(p) + { + var n = p.length>>1; + if(n<4) return true; + var a1 = new PolyK._P(), a2 = new PolyK._P(); + var b1 = new PolyK._P(), b2 = new PolyK._P(); + var c = new PolyK._P(); + + for(var i=0; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PolyK._convex(ax, ay, bx, by, cx, cy)) + { + earFound = true; + for(var j=0; j 3*al) break; // no convex angles :( + } + tgs.push(avl[0], avl[1], avl[2]); + return tgs; + } + + PolyK.ContainsPoint = function(p, px, py) + { + var n = p.length>>1; + var ax, ay, bx = p[2*n-2]-px, by = p[2*n-1]-py; + var depth = 0; + for(var i=0; i=0 && by>=0) continue; // both "up" or both "donw" + if(ax< 0 && bx< 0) continue; + + var lx = ax + (bx-ax)*(-ay)/(by-ay); + if(lx>0) depth++; + } + return (depth & 1) == 1; + } + + PolyK.Slice = function(p, ax, ay, bx, by) + { + if(PolyK.ContainsPoint(p, ax, ay) || PolyK.ContainsPoint(p, bx, by)) return [p.slice(0)]; + + var a = new PolyK._P(ax, ay); + var b = new PolyK._P(bx, by); + var iscs = []; // intersections + var ps = []; // points + for(var i=0; i 0) + { + var n = ps.length; + var i0 = iscs[0]; + var i1 = iscs[1]; + var ind0 = ps.indexOf(i0); + var ind1 = ps.indexOf(i1); + var solved = false; + + if(PolyK._firstWithFlag(ps, ind0) == ind1) solved = true; + else + { + i0 = iscs[1]; + i1 = iscs[0]; + ind0 = ps.indexOf(i0); + ind1 = ps.indexOf(i1); + if(PolyK._firstWithFlag(ps, ind0) == ind1) solved = true; + } + if(solved) + { + dir--; + var pgn = PolyK._getPoints(ps, ind0, ind1); + pgs.push(pgn); + ps = PolyK._getPoints(ps, ind1, ind0); + i0.flag = i1.flag = false; + iscs.splice(0,2); + if(iscs.length == 0) pgs.push(ps); + } + else { dir++; iscs.reverse(); } + if(dir>1) break; + } + var result = []; + for(var i=0; i>1, isc); + } + b1.x = b2.x; b1.y = b2.y; + b2.x = p[0]; b2.y = p[1]; + PolyK._pointLineDist(a1, b1, b2, l>>1, isc); + + var idst = 1/isc.dist; + isc.norm.x = (x-isc.point.x)*idst; + isc.norm.y = (y-isc.point.y)*idst; + return isc; + } + + PolyK._pointLineDist = function(p, a, b, edge, isc) + { + var x = p.x, y = p.y, x1 = a.x, y1 = a.y, x2 = b.x, y2 = b.y; + + var A = x - x1; + var B = y - y1; + var C = x2 - x1; + var D = y2 - y1; + + var dot = A * C + B * D; + var len_sq = C * C + D * D; + var param = dot / len_sq; + + var xx, yy; + + if (param < 0 || (x1 == x2 && y1 == y2)) { + xx = x1; + yy = y1; + } + else if (param > 1) { + xx = x2; + yy = y2; + } + else { + xx = x1 + param * C; + yy = y1 + param * D; + } + + var dx = x - xx; + var dy = y - yy; + var dst = Math.sqrt(dx * dx + dy * dy); + if(dst= 0) && (v >= 0) && (u + v < 1); + } + + PolyK._RayLineIntersection = function(a1, a2, b1, b2, c) + { + var dax = (a1.x-a2.x), dbx = (b1.x-b2.x); + var day = (a1.y-a2.y), dby = (b1.y-b2.y); + + var Den = dax*dby - day*dbx; + if (Den == 0) return null; // parallel + + var A = (a1.x * a2.y - a1.y * a2.x); + var B = (b1.x * b2.y - b1.y * b2.x); + + var I = c; + var iDen = 1/Den; + I.x = ( A*dbx - dax*B ) * iDen; + I.y = ( A*dby - day*B ) * iDen; + + if(!PolyK._InRect(I, b1, b2)) return null; + if((day>0 && I.y>a1.y) || (day<0 && I.y0 && I.x>a1.x) || (dax<0 && I.x=Math.min(b.y, c.y) && a.y<=Math.max(b.y, c.y)); + if (b.y == c.y) return (a.x>=Math.min(b.x, c.x) && a.x<=Math.max(b.x, c.x)); + + if(a.x >= Math.min(b.x, c.x) && a.x <= Math.max(b.x, c.x) + && a.y >= Math.min(b.y, c.y) && a.y <= Math.max(b.y, c.y)) + return true; + return false; + } + + PolyK._convex = function(ax, ay, bx, by, cx, cy) + { + return (ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0; + } + + PolyK._P = function(x,y) + { + this.x = x; + this.y = y; + this.flag = false; + } + PolyK._P.prototype.toString = function() + { + return "Point ["+this.x+", "+this.y+"]"; + } + PolyK._P.dist = function(a,b) + { + var dx = b.x-a.x; + var dy = b.y-a.y; + return Math.sqrt(dx*dx + dy*dy); + } + + PolyK._tp = []; + for(var i=0; i<10; i++) PolyK._tp.push(new PolyK._P(0,0)); \ No newline at end of file diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i - - + diff --git a/examples/example 13 - Graphics/pixi.js b/examples/example 13 - Graphics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 13 - Graphics/pixi.js +++ b/examples/example 13 - Graphics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -72,21 +88,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -106,16 +125,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -130,8 +148,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -155,9 +173,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -170,26 +189,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -198,8 +215,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -209,6 +226,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -233,12 +252,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -248,7 +274,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -256,12 +283,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -274,27 +298,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -309,18 +350,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -329,22 +372,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -352,92 +443,5 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} - -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} diff --git a/src/pixi/renderers/webgl/WebGLRenderGroup.js b/src/pixi/renderers/webgl/WebGLRenderGroup.js index a193406..ba26f06 100644 --- a/src/pixi/renderers/webgl/WebGLRenderGroup.js +++ b/src/pixi/renderers/webgl/WebGLRenderGroup.js @@ -43,15 +43,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -68,28 +70,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -171,28 +175,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -206,22 +197,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -231,21 +211,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -254,17 +222,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -518,6 +494,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -753,7 +730,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -789,17 +765,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -828,8 +813,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -855,11 +838,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } diff --git a/src/pixi/renderers/webgl/WebGLRenderer.js b/src/pixi/renderers/webgl/WebGLRenderer.js index 7b43b52..112407c 100644 --- a/src/pixi/renderers/webgl/WebGLRenderer.js +++ b/src/pixi/renderers/webgl/WebGLRenderer.js @@ -56,8 +56,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -68,7 +71,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -106,38 +110,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -186,7 +159,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -194,10 +167,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -298,12 +271,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** diff --git a/src/pixi/renderers/webgl/WebGLShaders.js b/src/pixi/renderers/webgl/WebGLShaders.js index 139ede9..2ba3c51 100644 --- a/src/pixi/renderers/webgl/WebGLShaders.js +++ b/src/pixi/renderers/webgl/WebGLShaders.js @@ -3,6 +3,11 @@ * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -18,20 +23,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -70,6 +172,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -77,12 +198,9 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/src/pixi/textures/RenderTexture.js b/src/pixi/textures/RenderTexture.js index 3c13ad6..537cd94 100644 --- a/src/pixi/textures/RenderTexture.js +++ b/src/pixi/textures/RenderTexture.js @@ -65,6 +65,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -115,6 +117,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + \ No newline at end of file diff --git a/src/pixi/utils/pixi.js example 13 - Graphics.html b/src/pixi/utils/pixi.js example 13 - Graphics.html new file mode 100644 index 0000000..3115e6c --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics.html @@ -0,0 +1,203 @@ + + + + pixi.js example 13 - Graphics + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasGraphics.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasGraphics.js new file mode 100644 index 0000000..ac9c961 --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasGraphics.js @@ -0,0 +1,129 @@ +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + +/** + * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. + * @class DisplayObjectContainer + * @extends DisplayObject + * @constructor + */ +PIXI.CanvasGraphics = function() +{ + +} + +// constructor + +PIXI.CanvasGraphics.renderGraphics = function(graphics, context) +{ + + for (var i=0; i < graphics.graphicsData.length; i++) + { + var data = graphics.graphicsData[i]; + var points = data.points; + + context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); + + context.lineWidth = data.lineWidth; + context.globalAlpha = data.lineAlpha; + + if(data.type == PIXI.Graphics.POLY) + { + if(data.lineWidth <= 0)continue; + + context.beginPath(); + + context.moveTo(points[0], points[1]); + + for (var j=1; j < points.length/2; j++) + { + context.lineTo(points[j * 2], points[j * 2 + 1]); + } + + // if the first and last point are the same close the path - much neater :) + if(points[0] == points[points.length-2] && points[1] == points[points.length-1]) + { + context.closePath(); + } + + context.stroke(); + } + else if(data.type == PIXI.Graphics.RECT) + { + // TODO - need to be Undefined! + if(data.fillColor) + { + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + + context.fillRect(points[0], points[1], points[2], points[3]); + + } + if(data.lineWidth) + { + context.strokeRect(points[0], points[1], points[2], points[3]); + } + } + else if(data.type == PIXI.Graphics.CIRC) + { + // TODO - need to be Undefined! + context.beginPath(); + context.arc(points[0], points[1], points[2],0,2*Math.PI); + context.closePath(); + + if(data.fill) + { + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.stroke(); + } + } + + + }; +} diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasRenderer.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasRenderer.js new file mode 100644 index 0000000..7cb832c --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasRenderer.js @@ -0,0 +1 @@ +

File /pixi.js/src/pixi/renderers/CanvasRenderer.js not found

\ No newline at end of file diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/Graphics.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/Graphics.js new file mode 100644 index 0000000..a6a0667 --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/Graphics.js @@ -0,0 +1,163 @@ +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + +/** + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer + * @constructor + */ +PIXI.Graphics = function() +{ + PIXI.DisplayObjectContainer.call( this ); + + this.renderable = true; + + this.fillAlpha = 1; + + this.lineWidth = 2; + this.lineColor = "#FF0000"; + + this.graphicsData = []; + +} + +// constructor +PIXI.Graphics.constructor = PIXI.Graphics; +PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); + +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ +PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) +{ + this.lineWidth = lineWidth || 0; + this.lineColor = color || 0; + this.lineAlpha = (alpha == undefined) ? 1 : alpha; + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + this.graphicsData.push(this.currentPath); +} + +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ +PIXI.Graphics.prototype.moveTo = function(x, y) +{ + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + + this.currentPath.points.push(x, y); + + this.graphicsData.push(this.currentPath); +} + +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ +PIXI.Graphics.prototype.lineTo = function(x, y) +{ + this.currentPath.points.push(x, y); + this.dirty = true; +} + +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ +PIXI.Graphics.prototype.beginFill = function(color, alpha) +{ + this.filling = true; + this.fillColor = color || 0; + this.fillAlpha = alpha || 1; +} + +/** + * @method endFill + */ +PIXI.Graphics.prototype.endFill = function() +{ + this.filling = false; + this.fillColor = null; + this.fillAlpha = 1; +} + +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) +{ + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.RECT}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ +PIXI.Graphics.prototype.drawCircle = function( x, y, radius) +{ + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ +PIXI.Graphics.prototype.clear = function() +{ + this.dirty = true; + this.clearDirty = true; + this.graphicsData = []; +} + +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/Polyk.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/Polyk.js new file mode 100644 index 0000000..f61d0c6 --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/Polyk.js @@ -0,0 +1,473 @@ + + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + */ + + var PolyK = {}; + + /* + Is Polygon self-intersecting? + + O(n^2) + */ + + PolyK.IsSimple = function(p) + { + var n = p.length>>1; + if(n<4) return true; + var a1 = new PolyK._P(), a2 = new PolyK._P(); + var b1 = new PolyK._P(), b2 = new PolyK._P(); + var c = new PolyK._P(); + + for(var i=0; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PolyK._convex(ax, ay, bx, by, cx, cy)) + { + earFound = true; + for(var j=0; j 3*al) break; // no convex angles :( + } + tgs.push(avl[0], avl[1], avl[2]); + return tgs; + } + + PolyK.ContainsPoint = function(p, px, py) + { + var n = p.length>>1; + var ax, ay, bx = p[2*n-2]-px, by = p[2*n-1]-py; + var depth = 0; + for(var i=0; i=0 && by>=0) continue; // both "up" or both "donw" + if(ax< 0 && bx< 0) continue; + + var lx = ax + (bx-ax)*(-ay)/(by-ay); + if(lx>0) depth++; + } + return (depth & 1) == 1; + } + + PolyK.Slice = function(p, ax, ay, bx, by) + { + if(PolyK.ContainsPoint(p, ax, ay) || PolyK.ContainsPoint(p, bx, by)) return [p.slice(0)]; + + var a = new PolyK._P(ax, ay); + var b = new PolyK._P(bx, by); + var iscs = []; // intersections + var ps = []; // points + for(var i=0; i 0) + { + var n = ps.length; + var i0 = iscs[0]; + var i1 = iscs[1]; + var ind0 = ps.indexOf(i0); + var ind1 = ps.indexOf(i1); + var solved = false; + + if(PolyK._firstWithFlag(ps, ind0) == ind1) solved = true; + else + { + i0 = iscs[1]; + i1 = iscs[0]; + ind0 = ps.indexOf(i0); + ind1 = ps.indexOf(i1); + if(PolyK._firstWithFlag(ps, ind0) == ind1) solved = true; + } + if(solved) + { + dir--; + var pgn = PolyK._getPoints(ps, ind0, ind1); + pgs.push(pgn); + ps = PolyK._getPoints(ps, ind1, ind0); + i0.flag = i1.flag = false; + iscs.splice(0,2); + if(iscs.length == 0) pgs.push(ps); + } + else { dir++; iscs.reverse(); } + if(dir>1) break; + } + var result = []; + for(var i=0; i>1, isc); + } + b1.x = b2.x; b1.y = b2.y; + b2.x = p[0]; b2.y = p[1]; + PolyK._pointLineDist(a1, b1, b2, l>>1, isc); + + var idst = 1/isc.dist; + isc.norm.x = (x-isc.point.x)*idst; + isc.norm.y = (y-isc.point.y)*idst; + return isc; + } + + PolyK._pointLineDist = function(p, a, b, edge, isc) + { + var x = p.x, y = p.y, x1 = a.x, y1 = a.y, x2 = b.x, y2 = b.y; + + var A = x - x1; + var B = y - y1; + var C = x2 - x1; + var D = y2 - y1; + + var dot = A * C + B * D; + var len_sq = C * C + D * D; + var param = dot / len_sq; + + var xx, yy; + + if (param < 0 || (x1 == x2 && y1 == y2)) { + xx = x1; + yy = y1; + } + else if (param > 1) { + xx = x2; + yy = y2; + } + else { + xx = x1 + param * C; + yy = y1 + param * D; + } + + var dx = x - xx; + var dy = y - yy; + var dst = Math.sqrt(dx * dx + dy * dy); + if(dst= 0) && (v >= 0) && (u + v < 1); + } + + PolyK._RayLineIntersection = function(a1, a2, b1, b2, c) + { + var dax = (a1.x-a2.x), dbx = (b1.x-b2.x); + var day = (a1.y-a2.y), dby = (b1.y-b2.y); + + var Den = dax*dby - day*dbx; + if (Den == 0) return null; // parallel + + var A = (a1.x * a2.y - a1.y * a2.x); + var B = (b1.x * b2.y - b1.y * b2.x); + + var I = c; + var iDen = 1/Den; + I.x = ( A*dbx - dax*B ) * iDen; + I.y = ( A*dby - day*B ) * iDen; + + if(!PolyK._InRect(I, b1, b2)) return null; + if((day>0 && I.y>a1.y) || (day<0 && I.y0 && I.x>a1.x) || (dax<0 && I.x=Math.min(b.y, c.y) && a.y<=Math.max(b.y, c.y)); + if (b.y == c.y) return (a.x>=Math.min(b.x, c.x) && a.x<=Math.max(b.x, c.x)); + + if(a.x >= Math.min(b.x, c.x) && a.x <= Math.max(b.x, c.x) + && a.y >= Math.min(b.y, c.y) && a.y <= Math.max(b.y, c.y)) + return true; + return false; + } + + PolyK._convex = function(ax, ay, bx, by, cx, cy) + { + return (ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0; + } + + PolyK._P = function(x,y) + { + this.x = x; + this.y = y; + this.flag = false; + } + PolyK._P.prototype.toString = function() + { + return "Point ["+this.x+", "+this.y+"]"; + } + PolyK._P.dist = function(a,b) + { + var dx = b.x-a.x; + var dy = b.y-a.y; + return Math.sqrt(dx*dx + dy*dy); + } + + PolyK._tp = []; + for(var i=0; i<10; i++) PolyK._tp.push(new PolyK._P(0,0)); \ No newline at end of file diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/WebGLGraphics.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/WebGLGraphics.js new file mode 100644 index 0000000..51edba5 --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/WebGLGraphics.js @@ -0,0 +1,466 @@ +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + +/** + * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. + * @class DisplayObjectContainer + * @extends DisplayObject + * @constructor + */ +PIXI.WebGLGraphics = function() +{ + +} + +// constructor +PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; + +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) +{ + PIXI.activatePrimitiveShader(); + var gl = PIXI.gl; + + // graphicsObject + // a collection of "shapes" (mainly lines right now!) + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastPosition:new PIXI.Point(), lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; + + if(graphics.dirty) + { + graphics.dirty = false; + + if(graphics.clearDirty) + { + graphics.clearDirty = false; + + graphics._webGL.lastIndex = 0; + graphics._webGL.points = []; + } + + PIXI.WebGLGraphics.updateGraphics(graphics); + } + + // This could be speeded up fo sure! + + var m = PIXI.mat3.clone(graphics.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + + //gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... + PIXI.activateDefaultShader(); +} + +PIXI.WebGLGraphics.updateGraphics = function(graphics) +{ + for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) + { + var data = graphics.graphicsData[i]; + + + if(data.type == PIXI.Graphics.POLY) + { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + + if(data.lineWidth > 0) + { + PIXI.WebGLGraphics.buildLine(data, graphics._webGL); + } + + } + else if(data.type == PIXI.Graphics.RECT) + { + PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); + } + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) + { + PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); + } + }; + + //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) + graphics._webGL.lastIndex = graphics.graphicsData.length; + + // convert to points + var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); + gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); +} + + +PIXI.WebGLGraphics.buildRectangle = function(graphicsData, webGLData) +{ + // --- // + // need to convert points to a nice regular data + // + var rectData = graphicsData.points; + var x = rectData[0]; + var y = rectData[1]; + var width = rectData[2]; + var height = rectData[3]; + + + if(graphicsData.fill) + { + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var verts = webGLData.points; + + // dead triangle + verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); + verts.push(x, y, 1, 1, 1, 1); + + // start + verts.push(x, y); + verts.push(r, g, b, alpha); + + verts.push(x + width, y); + verts.push(r, g, b, alpha); + + verts.push(x , y + height); + verts.push(r, g, b, alpha); + + verts.push(x + width, y + height); + verts.push(r, g, b, alpha); + + webGLData.lastPosition.x = x + width; + webGLData.lastPosition.y = y + height; + } + + if(graphicsData.lineWidth) + { + graphicsData.points = [x, y, + x + width, y, + x + width, y + height, + x, y + height, + x, y]; + + PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); + } + +} + +PIXI.WebGLGraphics.buildCircle = function(graphicsData, webGLData) +{ + // --- // + // need to convert points to a nice regular data + // + var rectData = graphicsData.points; + var x = rectData[0]; + var y = rectData[1]; + var width = rectData[2]; + var height = rectData[3]; + + var totalSegs = 40; + var seg = (Math.PI * 2) / totalSegs ; + + if(graphicsData.fill) + { + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var verts = webGLData.points; + + verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); + verts.push(x, y, 1, 1, 1, 1); + + for (var i=0; i < totalSegs + 1 ; i++) + { + verts.push(x,y); + verts.push(r, g, b, alpha); + + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height); + + verts.push(r, g, b, alpha); + }; + + verts.push(x,y); + verts.push(1, 0, 0, 1); + + webGLData.lastPosition.x = x; + webGLData.lastPosition.y = y; + } + + if(graphicsData.lineWidth) + { + graphicsData.points = []; + + for (var i=0; i < totalSegs + 1; i++) + { + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) + }; + + PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); + } + +} + +PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) +{ + // TODO OPTIMISE! + + var wrap = true; + var points = graphicsData.points; + if(points.length == 0)return; + + // get first and last point.. figure out the middle! + var firstPoint = new PIXI.Point( points[0], points[1] ); + var lastPoint = new PIXI.Point( points[points.length - 2], points[points.length - 1] ); + + // if the first point is the last point - goona have issues :) + if(firstPoint.x == lastPoint.x && firstPoint.y == lastPoint.y) + { + points.pop(); + points.pop(); + + lastPoint = new PIXI.Point( points[points.length - 2], points[points.length - 1] ); + + var midPointX = lastPoint.x + (firstPoint.x - lastPoint.x) *0.5; + var midPointY = lastPoint.y + (firstPoint.y - lastPoint.y) *0.5; + + points.unshift(midPointX, midPointY); + points.push(midPointX, midPointY) + } + + var verts = webGLData.points; + var indices = webGLData.indices; + + + var length = points.length / 2; + + var indexCount = points.length + 2; + + var indexStart = verts.length/6; + + // DRAW the Line + var width = graphicsData.lineWidth / 2; + + // sort color + var color = HEXtoRGB(graphicsData.lineColor); + var alpha = graphicsData.lineAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + // i = 0 // + var point1 = new PIXI.Point( points[0], points[1] ); + var point2 = new PIXI.Point( points[2], points[3] ); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); + var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); + + perp.x /= dist; + perp.y /= dist; + perp.x *= width; + perp.y *= width; + + // insert dead triangle as we are using a triangle strip + verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); + verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); + // start + + verts.push(points[0] - perp.x , points[1] - perp.y); + verts.push(r, g, b, alpha); + + verts.push(points[0] + perp.x , points[1] + perp.y); + verts.push(r, g, b, alpha); + + for (var i = 1; i < length-1; i++) + { + var point1 = new PIXI.Point( points[(i-1)*2],points[(i-1)*2 + 1] ); + var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); + var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); + var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); + perp.x /= dist; + perp.y /= dist; + perp.x *= width; + perp.y *= width; + + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); + var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); + perp2.x /= dist2; + perp2.y /= dist2; + perp2.x *= width; + perp2.y *= width; + + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + + + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); + + if(pdist > 140 * 140) + { + var perp3 = new PIXI.Point(perp.x - perp2.x, perp.y - perp2.y); + var dist3 = Math.sqrt(perp3.x*perp3.x + perp3.y*perp3.y); + perp3.x /= dist3; + perp3.y /= dist3; + perp3.x *= width; + perp3.y *= width; + + verts.push(point2.x - perp3.x, point2.y -perp3.y); + verts.push(r, g, b, alpha); + + verts.push(point2.x + perp3.x, point2.y +perp3.y); + verts.push(r, g, b, alpha); + + verts.push(point2.x - perp3.x, point2.y -perp3.y); + verts.push(r, g, b, alpha); + + indexCount++; + } + else + { + verts.push(p.x , p.y); + verts.push(r, g, b, alpha); + + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); + verts.push(r, g, b, alpha); + } + } + + var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); + var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); + //getPerp(point1, point2); + var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); + perp.x /= dist; + perp.y /= dist; + perp.x *= width; + perp.y *= width; + + verts.push(point2.x - perp.x , point2.y - perp.y) + verts.push(r, g, b, alpha); +// indices.push(indices.length) + + verts.push(point2.x + perp.x , point2.y + perp.y) + verts.push(r, g, b, alpha); +// indices.push(indices.length) + + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart + i); + }; + // set last triangle! + webGLData.lastPosition.x = point2.x + perp.x; + webGLData.lastPosition.y = point2.y + perp.y; +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.lineAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + + + + var triangles = PolyK.Triangulate(graphicsData.points); + + // DEAD Triangle + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + indices.push(verts.length/6) + indices.push(verts.length/6) + + var vertPos = verts.length / 6; + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; + +} + +function HEXtoRGB(hex) { + return [(hex >> 16 & 0xFF) / 255, ( hex >> 8 & 0xFF) / 255, (hex & 0xFF)/ 255]; +} + + + + diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i - - + diff --git a/examples/example 13 - Graphics/pixi.js b/examples/example 13 - Graphics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 13 - Graphics/pixi.js +++ b/examples/example 13 - Graphics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -72,21 +88,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -106,16 +125,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -130,8 +148,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -155,9 +173,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -170,26 +189,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -198,8 +215,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -209,6 +226,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -233,12 +252,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -248,7 +274,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -256,12 +283,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -274,27 +298,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -309,18 +350,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -329,22 +372,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -352,92 +443,5 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} - -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} diff --git a/src/pixi/renderers/webgl/WebGLRenderGroup.js b/src/pixi/renderers/webgl/WebGLRenderGroup.js index a193406..ba26f06 100644 --- a/src/pixi/renderers/webgl/WebGLRenderGroup.js +++ b/src/pixi/renderers/webgl/WebGLRenderGroup.js @@ -43,15 +43,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -68,28 +70,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -171,28 +175,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -206,22 +197,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -231,21 +211,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -254,17 +222,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -518,6 +494,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -753,7 +730,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -789,17 +765,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -828,8 +813,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -855,11 +838,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } diff --git a/src/pixi/renderers/webgl/WebGLRenderer.js b/src/pixi/renderers/webgl/WebGLRenderer.js index 7b43b52..112407c 100644 --- a/src/pixi/renderers/webgl/WebGLRenderer.js +++ b/src/pixi/renderers/webgl/WebGLRenderer.js @@ -56,8 +56,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -68,7 +71,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -106,38 +110,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -186,7 +159,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -194,10 +167,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -298,12 +271,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** diff --git a/src/pixi/renderers/webgl/WebGLShaders.js b/src/pixi/renderers/webgl/WebGLShaders.js index 139ede9..2ba3c51 100644 --- a/src/pixi/renderers/webgl/WebGLShaders.js +++ b/src/pixi/renderers/webgl/WebGLShaders.js @@ -3,6 +3,11 @@ * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -18,20 +23,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -70,6 +172,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -77,12 +198,9 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/src/pixi/textures/RenderTexture.js b/src/pixi/textures/RenderTexture.js index 3c13ad6..537cd94 100644 --- a/src/pixi/textures/RenderTexture.js +++ b/src/pixi/textures/RenderTexture.js @@ -65,6 +65,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -115,6 +117,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + \ No newline at end of file diff --git a/src/pixi/utils/pixi.js example 13 - Graphics.html b/src/pixi/utils/pixi.js example 13 - Graphics.html new file mode 100644 index 0000000..3115e6c --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics.html @@ -0,0 +1,203 @@ + + + + pixi.js example 13 - Graphics + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasGraphics.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasGraphics.js new file mode 100644 index 0000000..ac9c961 --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasGraphics.js @@ -0,0 +1,129 @@ +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + +/** + * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. + * @class DisplayObjectContainer + * @extends DisplayObject + * @constructor + */ +PIXI.CanvasGraphics = function() +{ + +} + +// constructor + +PIXI.CanvasGraphics.renderGraphics = function(graphics, context) +{ + + for (var i=0; i < graphics.graphicsData.length; i++) + { + var data = graphics.graphicsData[i]; + var points = data.points; + + context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); + + context.lineWidth = data.lineWidth; + context.globalAlpha = data.lineAlpha; + + if(data.type == PIXI.Graphics.POLY) + { + if(data.lineWidth <= 0)continue; + + context.beginPath(); + + context.moveTo(points[0], points[1]); + + for (var j=1; j < points.length/2; j++) + { + context.lineTo(points[j * 2], points[j * 2 + 1]); + } + + // if the first and last point are the same close the path - much neater :) + if(points[0] == points[points.length-2] && points[1] == points[points.length-1]) + { + context.closePath(); + } + + context.stroke(); + } + else if(data.type == PIXI.Graphics.RECT) + { + // TODO - need to be Undefined! + if(data.fillColor) + { + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + + context.fillRect(points[0], points[1], points[2], points[3]); + + } + if(data.lineWidth) + { + context.strokeRect(points[0], points[1], points[2], points[3]); + } + } + else if(data.type == PIXI.Graphics.CIRC) + { + // TODO - need to be Undefined! + context.beginPath(); + context.arc(points[0], points[1], points[2],0,2*Math.PI); + context.closePath(); + + if(data.fill) + { + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.stroke(); + } + } + + + }; +} diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasRenderer.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasRenderer.js new file mode 100644 index 0000000..7cb832c --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasRenderer.js @@ -0,0 +1 @@ +

File /pixi.js/src/pixi/renderers/CanvasRenderer.js not found

\ No newline at end of file diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/Graphics.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/Graphics.js new file mode 100644 index 0000000..a6a0667 --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/Graphics.js @@ -0,0 +1,163 @@ +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + +/** + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer + * @constructor + */ +PIXI.Graphics = function() +{ + PIXI.DisplayObjectContainer.call( this ); + + this.renderable = true; + + this.fillAlpha = 1; + + this.lineWidth = 2; + this.lineColor = "#FF0000"; + + this.graphicsData = []; + +} + +// constructor +PIXI.Graphics.constructor = PIXI.Graphics; +PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); + +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ +PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) +{ + this.lineWidth = lineWidth || 0; + this.lineColor = color || 0; + this.lineAlpha = (alpha == undefined) ? 1 : alpha; + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + this.graphicsData.push(this.currentPath); +} + +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ +PIXI.Graphics.prototype.moveTo = function(x, y) +{ + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + + this.currentPath.points.push(x, y); + + this.graphicsData.push(this.currentPath); +} + +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ +PIXI.Graphics.prototype.lineTo = function(x, y) +{ + this.currentPath.points.push(x, y); + this.dirty = true; +} + +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ +PIXI.Graphics.prototype.beginFill = function(color, alpha) +{ + this.filling = true; + this.fillColor = color || 0; + this.fillAlpha = alpha || 1; +} + +/** + * @method endFill + */ +PIXI.Graphics.prototype.endFill = function() +{ + this.filling = false; + this.fillColor = null; + this.fillAlpha = 1; +} + +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) +{ + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.RECT}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ +PIXI.Graphics.prototype.drawCircle = function( x, y, radius) +{ + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ +PIXI.Graphics.prototype.clear = function() +{ + this.dirty = true; + this.clearDirty = true; + this.graphicsData = []; +} + +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/Polyk.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/Polyk.js new file mode 100644 index 0000000..f61d0c6 --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/Polyk.js @@ -0,0 +1,473 @@ + + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + */ + + var PolyK = {}; + + /* + Is Polygon self-intersecting? + + O(n^2) + */ + + PolyK.IsSimple = function(p) + { + var n = p.length>>1; + if(n<4) return true; + var a1 = new PolyK._P(), a2 = new PolyK._P(); + var b1 = new PolyK._P(), b2 = new PolyK._P(); + var c = new PolyK._P(); + + for(var i=0; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PolyK._convex(ax, ay, bx, by, cx, cy)) + { + earFound = true; + for(var j=0; j 3*al) break; // no convex angles :( + } + tgs.push(avl[0], avl[1], avl[2]); + return tgs; + } + + PolyK.ContainsPoint = function(p, px, py) + { + var n = p.length>>1; + var ax, ay, bx = p[2*n-2]-px, by = p[2*n-1]-py; + var depth = 0; + for(var i=0; i=0 && by>=0) continue; // both "up" or both "donw" + if(ax< 0 && bx< 0) continue; + + var lx = ax + (bx-ax)*(-ay)/(by-ay); + if(lx>0) depth++; + } + return (depth & 1) == 1; + } + + PolyK.Slice = function(p, ax, ay, bx, by) + { + if(PolyK.ContainsPoint(p, ax, ay) || PolyK.ContainsPoint(p, bx, by)) return [p.slice(0)]; + + var a = new PolyK._P(ax, ay); + var b = new PolyK._P(bx, by); + var iscs = []; // intersections + var ps = []; // points + for(var i=0; i 0) + { + var n = ps.length; + var i0 = iscs[0]; + var i1 = iscs[1]; + var ind0 = ps.indexOf(i0); + var ind1 = ps.indexOf(i1); + var solved = false; + + if(PolyK._firstWithFlag(ps, ind0) == ind1) solved = true; + else + { + i0 = iscs[1]; + i1 = iscs[0]; + ind0 = ps.indexOf(i0); + ind1 = ps.indexOf(i1); + if(PolyK._firstWithFlag(ps, ind0) == ind1) solved = true; + } + if(solved) + { + dir--; + var pgn = PolyK._getPoints(ps, ind0, ind1); + pgs.push(pgn); + ps = PolyK._getPoints(ps, ind1, ind0); + i0.flag = i1.flag = false; + iscs.splice(0,2); + if(iscs.length == 0) pgs.push(ps); + } + else { dir++; iscs.reverse(); } + if(dir>1) break; + } + var result = []; + for(var i=0; i>1, isc); + } + b1.x = b2.x; b1.y = b2.y; + b2.x = p[0]; b2.y = p[1]; + PolyK._pointLineDist(a1, b1, b2, l>>1, isc); + + var idst = 1/isc.dist; + isc.norm.x = (x-isc.point.x)*idst; + isc.norm.y = (y-isc.point.y)*idst; + return isc; + } + + PolyK._pointLineDist = function(p, a, b, edge, isc) + { + var x = p.x, y = p.y, x1 = a.x, y1 = a.y, x2 = b.x, y2 = b.y; + + var A = x - x1; + var B = y - y1; + var C = x2 - x1; + var D = y2 - y1; + + var dot = A * C + B * D; + var len_sq = C * C + D * D; + var param = dot / len_sq; + + var xx, yy; + + if (param < 0 || (x1 == x2 && y1 == y2)) { + xx = x1; + yy = y1; + } + else if (param > 1) { + xx = x2; + yy = y2; + } + else { + xx = x1 + param * C; + yy = y1 + param * D; + } + + var dx = x - xx; + var dy = y - yy; + var dst = Math.sqrt(dx * dx + dy * dy); + if(dst= 0) && (v >= 0) && (u + v < 1); + } + + PolyK._RayLineIntersection = function(a1, a2, b1, b2, c) + { + var dax = (a1.x-a2.x), dbx = (b1.x-b2.x); + var day = (a1.y-a2.y), dby = (b1.y-b2.y); + + var Den = dax*dby - day*dbx; + if (Den == 0) return null; // parallel + + var A = (a1.x * a2.y - a1.y * a2.x); + var B = (b1.x * b2.y - b1.y * b2.x); + + var I = c; + var iDen = 1/Den; + I.x = ( A*dbx - dax*B ) * iDen; + I.y = ( A*dby - day*B ) * iDen; + + if(!PolyK._InRect(I, b1, b2)) return null; + if((day>0 && I.y>a1.y) || (day<0 && I.y0 && I.x>a1.x) || (dax<0 && I.x=Math.min(b.y, c.y) && a.y<=Math.max(b.y, c.y)); + if (b.y == c.y) return (a.x>=Math.min(b.x, c.x) && a.x<=Math.max(b.x, c.x)); + + if(a.x >= Math.min(b.x, c.x) && a.x <= Math.max(b.x, c.x) + && a.y >= Math.min(b.y, c.y) && a.y <= Math.max(b.y, c.y)) + return true; + return false; + } + + PolyK._convex = function(ax, ay, bx, by, cx, cy) + { + return (ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0; + } + + PolyK._P = function(x,y) + { + this.x = x; + this.y = y; + this.flag = false; + } + PolyK._P.prototype.toString = function() + { + return "Point ["+this.x+", "+this.y+"]"; + } + PolyK._P.dist = function(a,b) + { + var dx = b.x-a.x; + var dy = b.y-a.y; + return Math.sqrt(dx*dx + dy*dy); + } + + PolyK._tp = []; + for(var i=0; i<10; i++) PolyK._tp.push(new PolyK._P(0,0)); \ No newline at end of file diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/WebGLGraphics.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/WebGLGraphics.js new file mode 100644 index 0000000..51edba5 --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/WebGLGraphics.js @@ -0,0 +1,466 @@ +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + +/** + * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. + * @class DisplayObjectContainer + * @extends DisplayObject + * @constructor + */ +PIXI.WebGLGraphics = function() +{ + +} + +// constructor +PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; + +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) +{ + PIXI.activatePrimitiveShader(); + var gl = PIXI.gl; + + // graphicsObject + // a collection of "shapes" (mainly lines right now!) + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastPosition:new PIXI.Point(), lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; + + if(graphics.dirty) + { + graphics.dirty = false; + + if(graphics.clearDirty) + { + graphics.clearDirty = false; + + graphics._webGL.lastIndex = 0; + graphics._webGL.points = []; + } + + PIXI.WebGLGraphics.updateGraphics(graphics); + } + + // This could be speeded up fo sure! + + var m = PIXI.mat3.clone(graphics.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + + //gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... + PIXI.activateDefaultShader(); +} + +PIXI.WebGLGraphics.updateGraphics = function(graphics) +{ + for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) + { + var data = graphics.graphicsData[i]; + + + if(data.type == PIXI.Graphics.POLY) + { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + + if(data.lineWidth > 0) + { + PIXI.WebGLGraphics.buildLine(data, graphics._webGL); + } + + } + else if(data.type == PIXI.Graphics.RECT) + { + PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); + } + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) + { + PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); + } + }; + + //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) + graphics._webGL.lastIndex = graphics.graphicsData.length; + + // convert to points + var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); + gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); +} + + +PIXI.WebGLGraphics.buildRectangle = function(graphicsData, webGLData) +{ + // --- // + // need to convert points to a nice regular data + // + var rectData = graphicsData.points; + var x = rectData[0]; + var y = rectData[1]; + var width = rectData[2]; + var height = rectData[3]; + + + if(graphicsData.fill) + { + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var verts = webGLData.points; + + // dead triangle + verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); + verts.push(x, y, 1, 1, 1, 1); + + // start + verts.push(x, y); + verts.push(r, g, b, alpha); + + verts.push(x + width, y); + verts.push(r, g, b, alpha); + + verts.push(x , y + height); + verts.push(r, g, b, alpha); + + verts.push(x + width, y + height); + verts.push(r, g, b, alpha); + + webGLData.lastPosition.x = x + width; + webGLData.lastPosition.y = y + height; + } + + if(graphicsData.lineWidth) + { + graphicsData.points = [x, y, + x + width, y, + x + width, y + height, + x, y + height, + x, y]; + + PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); + } + +} + +PIXI.WebGLGraphics.buildCircle = function(graphicsData, webGLData) +{ + // --- // + // need to convert points to a nice regular data + // + var rectData = graphicsData.points; + var x = rectData[0]; + var y = rectData[1]; + var width = rectData[2]; + var height = rectData[3]; + + var totalSegs = 40; + var seg = (Math.PI * 2) / totalSegs ; + + if(graphicsData.fill) + { + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var verts = webGLData.points; + + verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); + verts.push(x, y, 1, 1, 1, 1); + + for (var i=0; i < totalSegs + 1 ; i++) + { + verts.push(x,y); + verts.push(r, g, b, alpha); + + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height); + + verts.push(r, g, b, alpha); + }; + + verts.push(x,y); + verts.push(1, 0, 0, 1); + + webGLData.lastPosition.x = x; + webGLData.lastPosition.y = y; + } + + if(graphicsData.lineWidth) + { + graphicsData.points = []; + + for (var i=0; i < totalSegs + 1; i++) + { + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) + }; + + PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); + } + +} + +PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) +{ + // TODO OPTIMISE! + + var wrap = true; + var points = graphicsData.points; + if(points.length == 0)return; + + // get first and last point.. figure out the middle! + var firstPoint = new PIXI.Point( points[0], points[1] ); + var lastPoint = new PIXI.Point( points[points.length - 2], points[points.length - 1] ); + + // if the first point is the last point - goona have issues :) + if(firstPoint.x == lastPoint.x && firstPoint.y == lastPoint.y) + { + points.pop(); + points.pop(); + + lastPoint = new PIXI.Point( points[points.length - 2], points[points.length - 1] ); + + var midPointX = lastPoint.x + (firstPoint.x - lastPoint.x) *0.5; + var midPointY = lastPoint.y + (firstPoint.y - lastPoint.y) *0.5; + + points.unshift(midPointX, midPointY); + points.push(midPointX, midPointY) + } + + var verts = webGLData.points; + var indices = webGLData.indices; + + + var length = points.length / 2; + + var indexCount = points.length + 2; + + var indexStart = verts.length/6; + + // DRAW the Line + var width = graphicsData.lineWidth / 2; + + // sort color + var color = HEXtoRGB(graphicsData.lineColor); + var alpha = graphicsData.lineAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + // i = 0 // + var point1 = new PIXI.Point( points[0], points[1] ); + var point2 = new PIXI.Point( points[2], points[3] ); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); + var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); + + perp.x /= dist; + perp.y /= dist; + perp.x *= width; + perp.y *= width; + + // insert dead triangle as we are using a triangle strip + verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); + verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); + // start + + verts.push(points[0] - perp.x , points[1] - perp.y); + verts.push(r, g, b, alpha); + + verts.push(points[0] + perp.x , points[1] + perp.y); + verts.push(r, g, b, alpha); + + for (var i = 1; i < length-1; i++) + { + var point1 = new PIXI.Point( points[(i-1)*2],points[(i-1)*2 + 1] ); + var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); + var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); + var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); + perp.x /= dist; + perp.y /= dist; + perp.x *= width; + perp.y *= width; + + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); + var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); + perp2.x /= dist2; + perp2.y /= dist2; + perp2.x *= width; + perp2.y *= width; + + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + + + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); + + if(pdist > 140 * 140) + { + var perp3 = new PIXI.Point(perp.x - perp2.x, perp.y - perp2.y); + var dist3 = Math.sqrt(perp3.x*perp3.x + perp3.y*perp3.y); + perp3.x /= dist3; + perp3.y /= dist3; + perp3.x *= width; + perp3.y *= width; + + verts.push(point2.x - perp3.x, point2.y -perp3.y); + verts.push(r, g, b, alpha); + + verts.push(point2.x + perp3.x, point2.y +perp3.y); + verts.push(r, g, b, alpha); + + verts.push(point2.x - perp3.x, point2.y -perp3.y); + verts.push(r, g, b, alpha); + + indexCount++; + } + else + { + verts.push(p.x , p.y); + verts.push(r, g, b, alpha); + + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); + verts.push(r, g, b, alpha); + } + } + + var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); + var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); + //getPerp(point1, point2); + var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); + perp.x /= dist; + perp.y /= dist; + perp.x *= width; + perp.y *= width; + + verts.push(point2.x - perp.x , point2.y - perp.y) + verts.push(r, g, b, alpha); +// indices.push(indices.length) + + verts.push(point2.x + perp.x , point2.y + perp.y) + verts.push(r, g, b, alpha); +// indices.push(indices.length) + + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart + i); + }; + // set last triangle! + webGLData.lastPosition.x = point2.x + perp.x; + webGLData.lastPosition.y = point2.y + perp.y; +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.lineAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + + + + var triangles = PolyK.Triangulate(graphicsData.points); + + // DEAD Triangle + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + indices.push(verts.length/6) + indices.push(verts.length/6) + + var vertPos = verts.length / 6; + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; + +} + +function HEXtoRGB(hex) { + return [(hex >> 16 & 0xFF) / 255, ( hex >> 8 & 0xFF) / 255, (hex & 0xFF)/ 255]; +} + + + + diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/WebGLRenderer.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/WebGLRenderer.js new file mode 100644 index 0000000..112407c --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/WebGLRenderer.js @@ -0,0 +1,320 @@ +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + +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 :) + * @class WebGLRenderer + * @constructor + * @param width {Number} the width of the canvas view + * @default 0 + * @param height {Number} the height of the canvas view + * @default 0 + * @param view {Canvas} the canvas to use as a view, optional + * @param transparent {Boolean} the transparency of the render view, default false + * @default false + * + */ +PIXI.WebGLRenderer = function(width, height, view, transparent) +{ + // do a catch.. only 1 webGL renderer.. + + //console.log(transparent) + this.transparent = !!transparent; + + this.width = width || 800; + this.height = height || 600; + + this.view = view || document.createElement( 'canvas' ); + this.view.width = this.width; + this.view.height = this.height; + + // deal with losing context.. + var scope = this; + this.view.addEventListener('webglcontextlost', function(event) { scope.handleContextLost(event); }, false) + this.view.addEventListener('webglcontextrestored', function(event) { scope.handleContextRestored(event); }, false) + + this.batchs = []; + + try + { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { + alpha: this.transparent, + antialias:false, // SPEED UP?? + premultipliedAlpha:false + }); + } + catch (e) + { + throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); + } + + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); + + 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); + + PIXI.projection = new PIXI.Point(400, 300); + + this.resize(this.width, this.height); + this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); +} + +// constructor +PIXI.WebGLRenderer.constructor = PIXI.WebGLRenderer; + +/** + * @private + */ +PIXI.WebGLRenderer.getBatch = function() +{ + if(PIXI._batchs.length == 0) + { + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); + } + else + { + return PIXI._batchs.pop(); + } +} + +/** + * @private + */ +PIXI.WebGLRenderer.returnBatch = function(batch) +{ + batch.clean(); + PIXI._batchs.push(batch); +} + + +/** + * @private + */ + + + +/** + * Renders the stage to its webGL view + * @method render + * @param stage {Stage} the PIXI.Stage element to be rendered + */ +PIXI.WebGLRenderer.prototype.render = function(stage) +{ + if(this.contextLost)return; + + + // if rendering a new stage clear the batchs.. + if(this.__stage !== stage) + { + // TODO make this work + // dont think this is needed any more? + //if(this.__stage)this.checkVisibility(this.__stage, false) + + this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); + } + + // TODO not needed now... + // update children if need be + // best to remove first! + /*for (var i=0; i < stage.__childrenRemoved.length; i++) + { + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); + }*/ + + // update any textures + PIXI.WebGLRenderer.updateTextures(); + + // recursivly loop through all items! + //this.checkVisibility(stage, true); + + // update the scene graph + stage.updateTransform(); + + var gl = this.gl; + + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); + + // set the correct matrix.. + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], !this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // HACK TO TEST + //PIXI.projectionMatrix = this.projectionMatrix; + + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(PIXI.projection); + + // interaction + // run interaction! + if(stage.interactive) + { + //need to add some events! + if(!stage._interactiveEventsAdded) + { + stage._interactiveEventsAdded = true; + stage.interactionManager.setTarget(this); + } + } + + // after rendering lets confirm all frames that have been uodated.. + if(PIXI.Texture.frameUpdates.length > 0) + { + for (var i=0; i < PIXI.Texture.frameUpdates.length; i++) + { + PIXI.Texture.frameUpdates[i].updateFrame = false; + }; + + PIXI.Texture.frameUpdates = []; + } +} + +/** + * @private + */ + +PIXI.WebGLRenderer.updateTextures = function() +{ + for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); + for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); + PIXI.texturesToUpdate = []; + PIXI.texturesToDestroy = []; +} + +PIXI.WebGLRenderer.updateTexture = function(texture) +{ + var gl = PIXI.gl; + + if(!texture._glTexture) + { + texture._glTexture = gl.createTexture(); + } + + if(texture.hasLoaded) + { + gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); + gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + + // reguler... + + if(!texture._powerOf2) + { + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + } + else + { + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); + } + + gl.bindTexture(gl.TEXTURE_2D, null); + } + +} + +PIXI.WebGLRenderer.prototype.destroyTexture = function(texture) +{ + var gl = this.gl; + + if(texture._glTexture) + { + texture._glTexture = gl.createTexture(); + gl.deleteTexture(gl.TEXTURE_2D, texture._glTexture); + } +} + +/** + * resizes the webGL view to the specified width and height + * @method resize + * @param width {Number} the new width of the webGL view + * @param height {Number} the new height of the webGL view + */ +PIXI.WebGLRenderer.prototype.resize = function(width, height) +{ + this.width = width; + this.height = height; + + this.view.width = width; + this.view.height = height; + + this.gl.viewport(0, 0, this.width, this.height); + + //var projectionMatrix = this.projectionMatrix; + + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; +} + +/** + * @private + */ +PIXI.WebGLRenderer.prototype.handleContextLost = function(event) +{ + event.preventDefault(); + this.contextLost = true; +} + +/** + * @private + */ +PIXI.WebGLRenderer.prototype.handleContextRestored = function(event) +{ + this.gl = this.view.getContext("experimental-webgl", { + alpha: true + }); + + this.initShaders(); + + for (var i=0; i < PIXI.TextureCache.length; i++) + { + this.updateTexture(PIXI.TextureCache[i]); + }; + + for (var i=0; i < this.batchs.length; i++) + { + this.batchs[i].restoreLostContext(this.gl)// + this.batchs[i].dirty = true; + }; + + PIXI._restoreBatchs(this.gl); + + this.contextLost = false; +} + diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i - - + diff --git a/examples/example 13 - Graphics/pixi.js b/examples/example 13 - Graphics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 13 - Graphics/pixi.js +++ b/examples/example 13 - Graphics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -72,21 +88,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -106,16 +125,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -130,8 +148,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -155,9 +173,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -170,26 +189,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -198,8 +215,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -209,6 +226,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -233,12 +252,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -248,7 +274,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -256,12 +283,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -274,27 +298,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -309,18 +350,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -329,22 +372,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -352,92 +443,5 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} - -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} diff --git a/src/pixi/renderers/webgl/WebGLRenderGroup.js b/src/pixi/renderers/webgl/WebGLRenderGroup.js index a193406..ba26f06 100644 --- a/src/pixi/renderers/webgl/WebGLRenderGroup.js +++ b/src/pixi/renderers/webgl/WebGLRenderGroup.js @@ -43,15 +43,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -68,28 +70,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -171,28 +175,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -206,22 +197,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -231,21 +211,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -254,17 +222,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -518,6 +494,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -753,7 +730,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -789,17 +765,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -828,8 +813,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -855,11 +838,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } diff --git a/src/pixi/renderers/webgl/WebGLRenderer.js b/src/pixi/renderers/webgl/WebGLRenderer.js index 7b43b52..112407c 100644 --- a/src/pixi/renderers/webgl/WebGLRenderer.js +++ b/src/pixi/renderers/webgl/WebGLRenderer.js @@ -56,8 +56,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -68,7 +71,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -106,38 +110,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -186,7 +159,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -194,10 +167,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -298,12 +271,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** diff --git a/src/pixi/renderers/webgl/WebGLShaders.js b/src/pixi/renderers/webgl/WebGLShaders.js index 139ede9..2ba3c51 100644 --- a/src/pixi/renderers/webgl/WebGLShaders.js +++ b/src/pixi/renderers/webgl/WebGLShaders.js @@ -3,6 +3,11 @@ * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -18,20 +23,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -70,6 +172,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -77,12 +198,9 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/src/pixi/textures/RenderTexture.js b/src/pixi/textures/RenderTexture.js index 3c13ad6..537cd94 100644 --- a/src/pixi/textures/RenderTexture.js +++ b/src/pixi/textures/RenderTexture.js @@ -65,6 +65,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -115,6 +117,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + \ No newline at end of file diff --git a/src/pixi/utils/pixi.js example 13 - Graphics.html b/src/pixi/utils/pixi.js example 13 - Graphics.html new file mode 100644 index 0000000..3115e6c --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics.html @@ -0,0 +1,203 @@ + + + + pixi.js example 13 - Graphics + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasGraphics.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasGraphics.js new file mode 100644 index 0000000..ac9c961 --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasGraphics.js @@ -0,0 +1,129 @@ +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + +/** + * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. + * @class DisplayObjectContainer + * @extends DisplayObject + * @constructor + */ +PIXI.CanvasGraphics = function() +{ + +} + +// constructor + +PIXI.CanvasGraphics.renderGraphics = function(graphics, context) +{ + + for (var i=0; i < graphics.graphicsData.length; i++) + { + var data = graphics.graphicsData[i]; + var points = data.points; + + context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); + + context.lineWidth = data.lineWidth; + context.globalAlpha = data.lineAlpha; + + if(data.type == PIXI.Graphics.POLY) + { + if(data.lineWidth <= 0)continue; + + context.beginPath(); + + context.moveTo(points[0], points[1]); + + for (var j=1; j < points.length/2; j++) + { + context.lineTo(points[j * 2], points[j * 2 + 1]); + } + + // if the first and last point are the same close the path - much neater :) + if(points[0] == points[points.length-2] && points[1] == points[points.length-1]) + { + context.closePath(); + } + + context.stroke(); + } + else if(data.type == PIXI.Graphics.RECT) + { + // TODO - need to be Undefined! + if(data.fillColor) + { + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + + context.fillRect(points[0], points[1], points[2], points[3]); + + } + if(data.lineWidth) + { + context.strokeRect(points[0], points[1], points[2], points[3]); + } + } + else if(data.type == PIXI.Graphics.CIRC) + { + // TODO - need to be Undefined! + context.beginPath(); + context.arc(points[0], points[1], points[2],0,2*Math.PI); + context.closePath(); + + if(data.fill) + { + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.stroke(); + } + } + + + }; +} diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasRenderer.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasRenderer.js new file mode 100644 index 0000000..7cb832c --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasRenderer.js @@ -0,0 +1 @@ +

File /pixi.js/src/pixi/renderers/CanvasRenderer.js not found

\ No newline at end of file diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/Graphics.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/Graphics.js new file mode 100644 index 0000000..a6a0667 --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/Graphics.js @@ -0,0 +1,163 @@ +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + +/** + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer + * @constructor + */ +PIXI.Graphics = function() +{ + PIXI.DisplayObjectContainer.call( this ); + + this.renderable = true; + + this.fillAlpha = 1; + + this.lineWidth = 2; + this.lineColor = "#FF0000"; + + this.graphicsData = []; + +} + +// constructor +PIXI.Graphics.constructor = PIXI.Graphics; +PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); + +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ +PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) +{ + this.lineWidth = lineWidth || 0; + this.lineColor = color || 0; + this.lineAlpha = (alpha == undefined) ? 1 : alpha; + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + this.graphicsData.push(this.currentPath); +} + +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ +PIXI.Graphics.prototype.moveTo = function(x, y) +{ + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + + this.currentPath.points.push(x, y); + + this.graphicsData.push(this.currentPath); +} + +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ +PIXI.Graphics.prototype.lineTo = function(x, y) +{ + this.currentPath.points.push(x, y); + this.dirty = true; +} + +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ +PIXI.Graphics.prototype.beginFill = function(color, alpha) +{ + this.filling = true; + this.fillColor = color || 0; + this.fillAlpha = alpha || 1; +} + +/** + * @method endFill + */ +PIXI.Graphics.prototype.endFill = function() +{ + this.filling = false; + this.fillColor = null; + this.fillAlpha = 1; +} + +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) +{ + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.RECT}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ +PIXI.Graphics.prototype.drawCircle = function( x, y, radius) +{ + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ +PIXI.Graphics.prototype.clear = function() +{ + this.dirty = true; + this.clearDirty = true; + this.graphicsData = []; +} + +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/Polyk.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/Polyk.js new file mode 100644 index 0000000..f61d0c6 --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/Polyk.js @@ -0,0 +1,473 @@ + + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + */ + + var PolyK = {}; + + /* + Is Polygon self-intersecting? + + O(n^2) + */ + + PolyK.IsSimple = function(p) + { + var n = p.length>>1; + if(n<4) return true; + var a1 = new PolyK._P(), a2 = new PolyK._P(); + var b1 = new PolyK._P(), b2 = new PolyK._P(); + var c = new PolyK._P(); + + for(var i=0; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PolyK._convex(ax, ay, bx, by, cx, cy)) + { + earFound = true; + for(var j=0; j 3*al) break; // no convex angles :( + } + tgs.push(avl[0], avl[1], avl[2]); + return tgs; + } + + PolyK.ContainsPoint = function(p, px, py) + { + var n = p.length>>1; + var ax, ay, bx = p[2*n-2]-px, by = p[2*n-1]-py; + var depth = 0; + for(var i=0; i=0 && by>=0) continue; // both "up" or both "donw" + if(ax< 0 && bx< 0) continue; + + var lx = ax + (bx-ax)*(-ay)/(by-ay); + if(lx>0) depth++; + } + return (depth & 1) == 1; + } + + PolyK.Slice = function(p, ax, ay, bx, by) + { + if(PolyK.ContainsPoint(p, ax, ay) || PolyK.ContainsPoint(p, bx, by)) return [p.slice(0)]; + + var a = new PolyK._P(ax, ay); + var b = new PolyK._P(bx, by); + var iscs = []; // intersections + var ps = []; // points + for(var i=0; i 0) + { + var n = ps.length; + var i0 = iscs[0]; + var i1 = iscs[1]; + var ind0 = ps.indexOf(i0); + var ind1 = ps.indexOf(i1); + var solved = false; + + if(PolyK._firstWithFlag(ps, ind0) == ind1) solved = true; + else + { + i0 = iscs[1]; + i1 = iscs[0]; + ind0 = ps.indexOf(i0); + ind1 = ps.indexOf(i1); + if(PolyK._firstWithFlag(ps, ind0) == ind1) solved = true; + } + if(solved) + { + dir--; + var pgn = PolyK._getPoints(ps, ind0, ind1); + pgs.push(pgn); + ps = PolyK._getPoints(ps, ind1, ind0); + i0.flag = i1.flag = false; + iscs.splice(0,2); + if(iscs.length == 0) pgs.push(ps); + } + else { dir++; iscs.reverse(); } + if(dir>1) break; + } + var result = []; + for(var i=0; i>1, isc); + } + b1.x = b2.x; b1.y = b2.y; + b2.x = p[0]; b2.y = p[1]; + PolyK._pointLineDist(a1, b1, b2, l>>1, isc); + + var idst = 1/isc.dist; + isc.norm.x = (x-isc.point.x)*idst; + isc.norm.y = (y-isc.point.y)*idst; + return isc; + } + + PolyK._pointLineDist = function(p, a, b, edge, isc) + { + var x = p.x, y = p.y, x1 = a.x, y1 = a.y, x2 = b.x, y2 = b.y; + + var A = x - x1; + var B = y - y1; + var C = x2 - x1; + var D = y2 - y1; + + var dot = A * C + B * D; + var len_sq = C * C + D * D; + var param = dot / len_sq; + + var xx, yy; + + if (param < 0 || (x1 == x2 && y1 == y2)) { + xx = x1; + yy = y1; + } + else if (param > 1) { + xx = x2; + yy = y2; + } + else { + xx = x1 + param * C; + yy = y1 + param * D; + } + + var dx = x - xx; + var dy = y - yy; + var dst = Math.sqrt(dx * dx + dy * dy); + if(dst= 0) && (v >= 0) && (u + v < 1); + } + + PolyK._RayLineIntersection = function(a1, a2, b1, b2, c) + { + var dax = (a1.x-a2.x), dbx = (b1.x-b2.x); + var day = (a1.y-a2.y), dby = (b1.y-b2.y); + + var Den = dax*dby - day*dbx; + if (Den == 0) return null; // parallel + + var A = (a1.x * a2.y - a1.y * a2.x); + var B = (b1.x * b2.y - b1.y * b2.x); + + var I = c; + var iDen = 1/Den; + I.x = ( A*dbx - dax*B ) * iDen; + I.y = ( A*dby - day*B ) * iDen; + + if(!PolyK._InRect(I, b1, b2)) return null; + if((day>0 && I.y>a1.y) || (day<0 && I.y0 && I.x>a1.x) || (dax<0 && I.x=Math.min(b.y, c.y) && a.y<=Math.max(b.y, c.y)); + if (b.y == c.y) return (a.x>=Math.min(b.x, c.x) && a.x<=Math.max(b.x, c.x)); + + if(a.x >= Math.min(b.x, c.x) && a.x <= Math.max(b.x, c.x) + && a.y >= Math.min(b.y, c.y) && a.y <= Math.max(b.y, c.y)) + return true; + return false; + } + + PolyK._convex = function(ax, ay, bx, by, cx, cy) + { + return (ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0; + } + + PolyK._P = function(x,y) + { + this.x = x; + this.y = y; + this.flag = false; + } + PolyK._P.prototype.toString = function() + { + return "Point ["+this.x+", "+this.y+"]"; + } + PolyK._P.dist = function(a,b) + { + var dx = b.x-a.x; + var dy = b.y-a.y; + return Math.sqrt(dx*dx + dy*dy); + } + + PolyK._tp = []; + for(var i=0; i<10; i++) PolyK._tp.push(new PolyK._P(0,0)); \ No newline at end of file diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/WebGLGraphics.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/WebGLGraphics.js new file mode 100644 index 0000000..51edba5 --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/WebGLGraphics.js @@ -0,0 +1,466 @@ +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + +/** + * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. + * @class DisplayObjectContainer + * @extends DisplayObject + * @constructor + */ +PIXI.WebGLGraphics = function() +{ + +} + +// constructor +PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; + +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) +{ + PIXI.activatePrimitiveShader(); + var gl = PIXI.gl; + + // graphicsObject + // a collection of "shapes" (mainly lines right now!) + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastPosition:new PIXI.Point(), lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; + + if(graphics.dirty) + { + graphics.dirty = false; + + if(graphics.clearDirty) + { + graphics.clearDirty = false; + + graphics._webGL.lastIndex = 0; + graphics._webGL.points = []; + } + + PIXI.WebGLGraphics.updateGraphics(graphics); + } + + // This could be speeded up fo sure! + + var m = PIXI.mat3.clone(graphics.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + + //gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... + PIXI.activateDefaultShader(); +} + +PIXI.WebGLGraphics.updateGraphics = function(graphics) +{ + for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) + { + var data = graphics.graphicsData[i]; + + + if(data.type == PIXI.Graphics.POLY) + { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + + if(data.lineWidth > 0) + { + PIXI.WebGLGraphics.buildLine(data, graphics._webGL); + } + + } + else if(data.type == PIXI.Graphics.RECT) + { + PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); + } + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) + { + PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); + } + }; + + //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) + graphics._webGL.lastIndex = graphics.graphicsData.length; + + // convert to points + var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); + gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); +} + + +PIXI.WebGLGraphics.buildRectangle = function(graphicsData, webGLData) +{ + // --- // + // need to convert points to a nice regular data + // + var rectData = graphicsData.points; + var x = rectData[0]; + var y = rectData[1]; + var width = rectData[2]; + var height = rectData[3]; + + + if(graphicsData.fill) + { + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var verts = webGLData.points; + + // dead triangle + verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); + verts.push(x, y, 1, 1, 1, 1); + + // start + verts.push(x, y); + verts.push(r, g, b, alpha); + + verts.push(x + width, y); + verts.push(r, g, b, alpha); + + verts.push(x , y + height); + verts.push(r, g, b, alpha); + + verts.push(x + width, y + height); + verts.push(r, g, b, alpha); + + webGLData.lastPosition.x = x + width; + webGLData.lastPosition.y = y + height; + } + + if(graphicsData.lineWidth) + { + graphicsData.points = [x, y, + x + width, y, + x + width, y + height, + x, y + height, + x, y]; + + PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); + } + +} + +PIXI.WebGLGraphics.buildCircle = function(graphicsData, webGLData) +{ + // --- // + // need to convert points to a nice regular data + // + var rectData = graphicsData.points; + var x = rectData[0]; + var y = rectData[1]; + var width = rectData[2]; + var height = rectData[3]; + + var totalSegs = 40; + var seg = (Math.PI * 2) / totalSegs ; + + if(graphicsData.fill) + { + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var verts = webGLData.points; + + verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); + verts.push(x, y, 1, 1, 1, 1); + + for (var i=0; i < totalSegs + 1 ; i++) + { + verts.push(x,y); + verts.push(r, g, b, alpha); + + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height); + + verts.push(r, g, b, alpha); + }; + + verts.push(x,y); + verts.push(1, 0, 0, 1); + + webGLData.lastPosition.x = x; + webGLData.lastPosition.y = y; + } + + if(graphicsData.lineWidth) + { + graphicsData.points = []; + + for (var i=0; i < totalSegs + 1; i++) + { + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) + }; + + PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); + } + +} + +PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) +{ + // TODO OPTIMISE! + + var wrap = true; + var points = graphicsData.points; + if(points.length == 0)return; + + // get first and last point.. figure out the middle! + var firstPoint = new PIXI.Point( points[0], points[1] ); + var lastPoint = new PIXI.Point( points[points.length - 2], points[points.length - 1] ); + + // if the first point is the last point - goona have issues :) + if(firstPoint.x == lastPoint.x && firstPoint.y == lastPoint.y) + { + points.pop(); + points.pop(); + + lastPoint = new PIXI.Point( points[points.length - 2], points[points.length - 1] ); + + var midPointX = lastPoint.x + (firstPoint.x - lastPoint.x) *0.5; + var midPointY = lastPoint.y + (firstPoint.y - lastPoint.y) *0.5; + + points.unshift(midPointX, midPointY); + points.push(midPointX, midPointY) + } + + var verts = webGLData.points; + var indices = webGLData.indices; + + + var length = points.length / 2; + + var indexCount = points.length + 2; + + var indexStart = verts.length/6; + + // DRAW the Line + var width = graphicsData.lineWidth / 2; + + // sort color + var color = HEXtoRGB(graphicsData.lineColor); + var alpha = graphicsData.lineAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + // i = 0 // + var point1 = new PIXI.Point( points[0], points[1] ); + var point2 = new PIXI.Point( points[2], points[3] ); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); + var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); + + perp.x /= dist; + perp.y /= dist; + perp.x *= width; + perp.y *= width; + + // insert dead triangle as we are using a triangle strip + verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); + verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); + // start + + verts.push(points[0] - perp.x , points[1] - perp.y); + verts.push(r, g, b, alpha); + + verts.push(points[0] + perp.x , points[1] + perp.y); + verts.push(r, g, b, alpha); + + for (var i = 1; i < length-1; i++) + { + var point1 = new PIXI.Point( points[(i-1)*2],points[(i-1)*2 + 1] ); + var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); + var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); + var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); + perp.x /= dist; + perp.y /= dist; + perp.x *= width; + perp.y *= width; + + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); + var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); + perp2.x /= dist2; + perp2.y /= dist2; + perp2.x *= width; + perp2.y *= width; + + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + + + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); + + if(pdist > 140 * 140) + { + var perp3 = new PIXI.Point(perp.x - perp2.x, perp.y - perp2.y); + var dist3 = Math.sqrt(perp3.x*perp3.x + perp3.y*perp3.y); + perp3.x /= dist3; + perp3.y /= dist3; + perp3.x *= width; + perp3.y *= width; + + verts.push(point2.x - perp3.x, point2.y -perp3.y); + verts.push(r, g, b, alpha); + + verts.push(point2.x + perp3.x, point2.y +perp3.y); + verts.push(r, g, b, alpha); + + verts.push(point2.x - perp3.x, point2.y -perp3.y); + verts.push(r, g, b, alpha); + + indexCount++; + } + else + { + verts.push(p.x , p.y); + verts.push(r, g, b, alpha); + + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); + verts.push(r, g, b, alpha); + } + } + + var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); + var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); + //getPerp(point1, point2); + var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); + perp.x /= dist; + perp.y /= dist; + perp.x *= width; + perp.y *= width; + + verts.push(point2.x - perp.x , point2.y - perp.y) + verts.push(r, g, b, alpha); +// indices.push(indices.length) + + verts.push(point2.x + perp.x , point2.y + perp.y) + verts.push(r, g, b, alpha); +// indices.push(indices.length) + + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart + i); + }; + // set last triangle! + webGLData.lastPosition.x = point2.x + perp.x; + webGLData.lastPosition.y = point2.y + perp.y; +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.lineAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + + + + var triangles = PolyK.Triangulate(graphicsData.points); + + // DEAD Triangle + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + indices.push(verts.length/6) + indices.push(verts.length/6) + + var vertPos = verts.length / 6; + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; + +} + +function HEXtoRGB(hex) { + return [(hex >> 16 & 0xFF) / 255, ( hex >> 8 & 0xFF) / 255, (hex & 0xFF)/ 255]; +} + + + + diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/WebGLRenderer.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/WebGLRenderer.js new file mode 100644 index 0000000..112407c --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/WebGLRenderer.js @@ -0,0 +1,320 @@ +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + +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 :) + * @class WebGLRenderer + * @constructor + * @param width {Number} the width of the canvas view + * @default 0 + * @param height {Number} the height of the canvas view + * @default 0 + * @param view {Canvas} the canvas to use as a view, optional + * @param transparent {Boolean} the transparency of the render view, default false + * @default false + * + */ +PIXI.WebGLRenderer = function(width, height, view, transparent) +{ + // do a catch.. only 1 webGL renderer.. + + //console.log(transparent) + this.transparent = !!transparent; + + this.width = width || 800; + this.height = height || 600; + + this.view = view || document.createElement( 'canvas' ); + this.view.width = this.width; + this.view.height = this.height; + + // deal with losing context.. + var scope = this; + this.view.addEventListener('webglcontextlost', function(event) { scope.handleContextLost(event); }, false) + this.view.addEventListener('webglcontextrestored', function(event) { scope.handleContextRestored(event); }, false) + + this.batchs = []; + + try + { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { + alpha: this.transparent, + antialias:false, // SPEED UP?? + premultipliedAlpha:false + }); + } + catch (e) + { + throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); + } + + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); + + 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); + + PIXI.projection = new PIXI.Point(400, 300); + + this.resize(this.width, this.height); + this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); +} + +// constructor +PIXI.WebGLRenderer.constructor = PIXI.WebGLRenderer; + +/** + * @private + */ +PIXI.WebGLRenderer.getBatch = function() +{ + if(PIXI._batchs.length == 0) + { + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); + } + else + { + return PIXI._batchs.pop(); + } +} + +/** + * @private + */ +PIXI.WebGLRenderer.returnBatch = function(batch) +{ + batch.clean(); + PIXI._batchs.push(batch); +} + + +/** + * @private + */ + + + +/** + * Renders the stage to its webGL view + * @method render + * @param stage {Stage} the PIXI.Stage element to be rendered + */ +PIXI.WebGLRenderer.prototype.render = function(stage) +{ + if(this.contextLost)return; + + + // if rendering a new stage clear the batchs.. + if(this.__stage !== stage) + { + // TODO make this work + // dont think this is needed any more? + //if(this.__stage)this.checkVisibility(this.__stage, false) + + this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); + } + + // TODO not needed now... + // update children if need be + // best to remove first! + /*for (var i=0; i < stage.__childrenRemoved.length; i++) + { + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); + }*/ + + // update any textures + PIXI.WebGLRenderer.updateTextures(); + + // recursivly loop through all items! + //this.checkVisibility(stage, true); + + // update the scene graph + stage.updateTransform(); + + var gl = this.gl; + + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); + + // set the correct matrix.. + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], !this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // HACK TO TEST + //PIXI.projectionMatrix = this.projectionMatrix; + + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(PIXI.projection); + + // interaction + // run interaction! + if(stage.interactive) + { + //need to add some events! + if(!stage._interactiveEventsAdded) + { + stage._interactiveEventsAdded = true; + stage.interactionManager.setTarget(this); + } + } + + // after rendering lets confirm all frames that have been uodated.. + if(PIXI.Texture.frameUpdates.length > 0) + { + for (var i=0; i < PIXI.Texture.frameUpdates.length; i++) + { + PIXI.Texture.frameUpdates[i].updateFrame = false; + }; + + PIXI.Texture.frameUpdates = []; + } +} + +/** + * @private + */ + +PIXI.WebGLRenderer.updateTextures = function() +{ + for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); + for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); + PIXI.texturesToUpdate = []; + PIXI.texturesToDestroy = []; +} + +PIXI.WebGLRenderer.updateTexture = function(texture) +{ + var gl = PIXI.gl; + + if(!texture._glTexture) + { + texture._glTexture = gl.createTexture(); + } + + if(texture.hasLoaded) + { + gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); + gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + + // reguler... + + if(!texture._powerOf2) + { + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + } + else + { + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); + } + + gl.bindTexture(gl.TEXTURE_2D, null); + } + +} + +PIXI.WebGLRenderer.prototype.destroyTexture = function(texture) +{ + var gl = this.gl; + + if(texture._glTexture) + { + texture._glTexture = gl.createTexture(); + gl.deleteTexture(gl.TEXTURE_2D, texture._glTexture); + } +} + +/** + * resizes the webGL view to the specified width and height + * @method resize + * @param width {Number} the new width of the webGL view + * @param height {Number} the new height of the webGL view + */ +PIXI.WebGLRenderer.prototype.resize = function(width, height) +{ + this.width = width; + this.height = height; + + this.view.width = width; + this.view.height = height; + + this.gl.viewport(0, 0, this.width, this.height); + + //var projectionMatrix = this.projectionMatrix; + + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; +} + +/** + * @private + */ +PIXI.WebGLRenderer.prototype.handleContextLost = function(event) +{ + event.preventDefault(); + this.contextLost = true; +} + +/** + * @private + */ +PIXI.WebGLRenderer.prototype.handleContextRestored = function(event) +{ + this.gl = this.view.getContext("experimental-webgl", { + alpha: true + }); + + this.initShaders(); + + for (var i=0; i < PIXI.TextureCache.length; i++) + { + this.updateTexture(PIXI.TextureCache[i]); + }; + + for (var i=0; i < this.batchs.length; i++) + { + this.batchs[i].restoreLostContext(this.gl)// + this.batchs[i].dirty = true; + }; + + PIXI._restoreBatchs(this.gl); + + this.contextLost = false; +} + diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/WebGLShaders.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/WebGLShaders.js new file mode 100644 index 0000000..2ba3c51 --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/WebGLShaders.js @@ -0,0 +1,206 @@ + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + +/* + * the default suoer fast shader! + */ + +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;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + +/* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* + * primitive shader.. + */ + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} + +PIXI.CompileVertexShader = function(gl, shaderSrc) +{ + return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); +} + +PIXI.CompileFragmentShader = function(gl, shaderSrc) +{ + return PIXI._CompileShader(gl, shaderSrc, gl.FRAGMENT_SHADER); +} + +PIXI._CompileShader = function(gl, shaderSrc, shaderType) +{ + var src = shaderSrc.join("\n"); + var shader = gl.createShader(shaderType); + gl.shaderSource(shader, src); + gl.compileShader(shader); + + if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { + alert(gl.getShaderInfoLog(shader)); + return null; + } + + return shader; +} + +PIXI.activateDefaultShader = function() +{ + var gl = PIXI.gl; + var shaderProgram = PIXI.shaderProgram; + + gl.useProgram(shaderProgram); + + gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(shaderProgram.textureCoordAttribute); + gl.enableVertexAttribArray(shaderProgram.colorAttribute); +} + +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + +PIXI.activatePrimitiveShader = function() +{ + var gl = PIXI.gl; + + gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); + gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); + + gl.useProgram(PIXI.primitiveProgram); + + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); +} + diff --git a/Gruntfile.js b/Gruntfile.js index e4c2b5d..238e600 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,7 @@ '<%= dirs.src %>/utils/Utils.js', '<%= dirs.src %>/utils/EventTarget.js', '<%= dirs.src %>/utils/Detector.js', + '<%= dirs.src %>/utils/Polyk.js', '<%= dirs.src %>/renderers/webgl/WebGLShaders.js', '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js', '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 21e9a00..dee3aca 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function i(t,e){return new o.Point(-(t.y-e.y),t.x-e.x)}function n(t,e,i,r){var n,s,a,h,l,u,c;s=e.y-t.y,h=t.x-e.x,u=e.x*t.y-t.x*e.y,a=r.y-i.y,l=i.x-r.x,c=r.x*i.y-i.x*r.y;var d=s*l-a*h;return 0==d&&(console.log("!"),d+=1),n=new o.Point,n.x=(h*c-l*u)/d,n.y=(a*u-s*c)/d,n}var s=this,o=o||{};o.Point=function(t,e){this.x=t||0,this.y=e||0},o.Point.prototype.clone=function(){return new o.Point(this.x,this.y)},o.Point.constructor=o.Point,o.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},o.Rectangle.prototype.clone=function(){return new o.Rectangle(this.x,this.y,this.width,this.height)},o.Rectangle.constructor=o.Rectangle,o.Polygon=function(t){this.points=t},o.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new o.Polygon(t)},o.Polygon.constructor=o.Polygon,t(),o.mat3={},o.mat3.create=function(){var t=new o.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},o.mat4={},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],m=e[4],g=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+m*a+g*l,i[4]=v*n+m*o+g*u,i[5]=v*s+m*h+g*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},o.mat3.toMat4=function(t,e){return e||(e=o.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},o.mat4.create=function(){var t=new o.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},o.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],m=t[13],g=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*m,i[2]=b*s+y*l+T*p+w*g,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*m,i[6]=b*s+y*l+T*p+w*g,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*m,i[10]=b*s+y*l+T*p+w*g,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*m,i[14]=b*s+y*l+T*p+w*g,i[15]=b*a+y*u+T*f+w*x,i},o.DisplayObject=function(){this.position=new o.Point,this.scale=new o.Point(1,1),this.pivot=new o.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=o.mat3.create(),this.localTransform=o.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},o.DisplayObject.constructor=o.DisplayObject,o.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},o.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],m=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+m,this.worldAlpha=this.alpha*this.parent.worldAlpha},o.DisplayObjectContainer=function(){o.DisplayObject.call(this),this.children=[],this.renderable=!1},o.DisplayObjectContainer.constructor=o.DisplayObjectContainer,o.DisplayObjectContainer.prototype=Object.create(o.DisplayObject.prototype),o.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))},o.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},o.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},o.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)},o.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},o.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){o.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},o.blendModes={},o.blendModes.NORMAL=0,o.blendModes.SCREEN=1,o.Sprite=function(t){o.DisplayObjectContainer.call(this),this.anchor=new o.Point,this.texture=t,this.blendMode=o.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},o.Sprite.constructor=o.Sprite,o.Sprite.prototype=Object.create(o.DisplayObjectContainer.prototype),Object.defineProperty(o.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(o.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}}),o.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},o.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},o.Sprite.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new o.Sprite(e)},o.Sprite.fromImage=function(t){var e=o.Texture.fromImage(t);return new o.Sprite(e)},o.MovieClip=function(t){o.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},o.MovieClip.constructor=o.MovieClip,o.MovieClip.prototype=Object.create(o.Sprite.prototype),o.MovieClip.prototype.stop=function(){this.playing=!1},o.MovieClip.prototype.play=function(){this.playing=!0},o.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])},o.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},o.MovieClip.prototype.updateTransform=function(){if(o.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())}},o.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),o.Sprite.call(this,o.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.Text.constructor=o.Text,o.Text.prototype=Object.create(o.Sprite.prototype),o.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},o.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},o.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,n=0;e.length>n;n++){var s=this.context.measureText(e[n]).width;i[n]=s,r=Math.max(r,s)}this.canvas.width=r+this.style.strokeThickness;var a=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=a*e.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",n=0;e.length>n;n++){var h=new o.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+n*a);"right"==this.style.align?h.x+=r-i[n]:"center"==this.style.align&&(h.x+=(r-i[n])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[n],h.x,h.y),this.style.fill&&this.context.fillText(e[n],h.x,h.y)}this.updateTexture()},o.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,this._width=this.canvas.width,this._height=this.canvas.height,o.texturesToUpdate.push(this.texture.baseTexture)},o.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),o.Sprite.prototype.updateTransform.call(this)},o.Text.prototype.determineFontHeight=function(t){var e=o.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),n=document.createTextNode("M");r.appendChild(n),r.setAttribute("style",t+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,o.Text.heightCache[t]=e,i.removeChild(r)}return e},o.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},o.Text.prototype.destroy=function(t){t&&this.texture.destroy()},o.Text.heightCache={},o.BitmapText=function(t,e){o.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},o.BitmapText.constructor=o.BitmapText,o.BitmapText.prototype=Object.create(o.DisplayObjectContainer.prototype),o.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},o.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):o.BitmapText.fonts[this.fontName].size,this.dirty=!0},o.BitmapText.prototype.updateText=function(){for(var t=o.BitmapText.fonts[this.fontName],e=new o.Point,i=null,r=[],n=0,s=[],a=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))s.push(e.x),n=Math.max(n,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:a,charCode:u,position:new o.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}s.push(e.x),n=Math.max(n,e.x);var d=[];for(l=0;a>=l;l++){var p=0;"right"==this.style.align?p=n-s[l]:"center"==this.style.align&&(p=(n-s[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new o.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},o.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}o.DisplayObjectContainer.prototype.updateTransform.call(this)},o.BitmapText.fonts={},o.InteractionManager=function(t){this.stage=t,this.tempPoint=new o.Point,this.mouseoverEnabled=!0,this.mouse=new o.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},o.InteractionManager.constructor=o.InteractionManager,o.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},o.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)},o.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},o.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},o.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}},o.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},o.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof o.Sprite,n=t.worldTransform,s=n[0],a=n[1],h=n[2],l=n[3],u=n[4],c=n[5],d=1/(s*u+a*-l),p=u*d*i.x+-a*d*i.y+(c*a-h*u)*d,f=s*d*i.y+-l*d*i.x+(-c*s+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof o.Polygon){for(var m=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,y=t.hitArea.points[g].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;_&&(m=!m)}if(m)return r&&(e.target=t),!0}else{var A=v.x;if(p>A&&A+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,L=t.texture.frame.height,A=-S*t.anchor.x;if(p>A&&A+S>p&&(R=-L*t.anchor.y,f>R&&R+L>f))return e.target=t,!0}for(var C=t.children.length,g=0;C>g;g++){var E=t.children[g],B=this.hitTest(E,e);if(B)return!0}return!1},o.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},o.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.pool.pop();s||(s=new o.InteractionData),this.touchs[n.identifier]=s,s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,h=0;a>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,s),l.__hit&&(l.touchstart&&l.touchstart(s),l.__isDown=!0,l.__touchData=s,!l.interactiveChildren)))break}}},o.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},o.InteractionData=function(){this.global=new o.Point,this.local=new o.Point,this.target},o.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],l=e[5],u=1/(r*h+n*-a);return new o.Point(h*u*i.x+-n*u*i.y+(l*n-s*h)*u,r*u*i.y+-a*u*i.x+(-l*r+s*a)*u)},o.InteractionData.constructor=o.InteractionData,o.Stage=function(t,e){o.DisplayObjectContainer.call(this),this.worldTransform=o.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new o.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new o.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},o.Stage.constructor=o.Stage,o.Stage.prototype=Object.create(o.DisplayObjectContainer.prototype),o.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()},o.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},o.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},o.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])},o.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])};for(var h=0,l=["ms","moz","webkit","o"],u=0;l.length>u&&!window.requestAnimationFrame;++u)window.requestAnimationFrame=window[l[u]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[l[u]+"CancelAnimationFrame"]||window[l[u]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-h)),r=window.setTimeout(function(){t(e+i)},i);return h=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var c=o.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){}};o.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)}},o.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var n=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return n?new o.WebGLRenderer(t,e,i,r):new o.CanvasRenderer(t,e,i,r)},o.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;","}"],o.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;","}"],o.CompileVertexShader=function(t,e){return o._CompileShader(t,e,t.VERTEX_SHADER)},o.CompileFragmentShader=function(t,e){return o._CompileShader(t,e,t.FRAGMENT_SHADER)},o._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},o.activateDefaultShader=function(){var t=o.gl,e=o.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},o.activatePrimitiveShader=function(){var t=o.gl;t.disableVertexAttribArray(o.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(o.shaderProgram.colorAttribute);var e=o.shaderProgram2;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(o.shaderProgram2.colorAttribute)},o.WebGLGraphics=function(){},o.WebGLGraphics.constructor=o.WebGLGraphics,o.WebGLGraphics.renderGraphics=function(t){o.activatePrimitiveShader();var e=o.gl;t._webGL||(t._webGL={points:[],lastPosition:new o.Point,lastIndex:0,buffer:e.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),o.WebGLGraphics.initGraphics(t)),e.uniformMatrix4fv(o.shaderProgram2.mvMatrixUniform,!1,o.projectionMatrix),e.bindBuffer(e.ARRAY_BUFFER,t._webGL.buffer),e.vertexAttribPointer(o.shaderProgram2.vertexPositionAttribute,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(o.shaderProgram2.colorAttribute,4,e.FLOAT,!1,24,8),e.drawArrays(e.TRIANGLE_STRIP,0,t._webGL.glPoints.length/6),o.activateDefaultShader()},o.WebGLGraphics.initGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==o.Graphics.POLY?i.lineWidth>0&&o.WebGLGraphics.buildLine(i,t._webGL):i.type==o.Graphics.RECT?o.WebGLGraphics.buildRectangle(i,t._webGL):i.type==o.Graphics.CIRC&&o.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length,t._webGL.glPoints=new Float32Array(t._webGL.points);var r=o.gl;r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW)},o.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points;f.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),f.push(n,s,1,1,1,1),f.push(n,s),f.push(c,d,p,u),f.push(n+a,s),f.push(c,d,p,u),f.push(n,s+h),f.push(c,d,p,u),f.push(n+a,s+h),f.push(c,d,p,u),i.lastPosition.x=n+a,i.lastPosition.y=s+h}t.lineWidth&&(t.points=[n,s,n+a,s,n+a,s+h,n,s+h,n,s],o.WebGLGraphics.buildLine(t,i))},o.WebGLGraphics.buildCircle=function(t,i){var r=t.points,n=r[0],s=r[1],a=r[2],h=40,l=2*Math.PI/h;if(t.fill){var u=e(t.fillColor),c=t.fillAlpha,d=u[0]*c,p=u[1]*c,f=u[2]*c,v=i.points;v.push(i.lastPosition.x,i.lastPosition.y,1,1,1,1),v.push(n,s,1,1,1,1);for(var m=0;h+1>m;m++)v.push(n,s),v.push(d,p,f,c),v.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a),v.push(d,p,f,c);v.push(n,s),v.push(1,0,0,1),i.lastPosition.x=n,i.lastPosition.y=s}if(t.lineWidth){t.points=[];for(var m=0;h+1>m;m++)t.points.push(n+Math.sin(l*m)*a,s+Math.cos(l*m)*a);o.WebGLGraphics.buildLine(t,i)}},o.WebGLGraphics.buildLine=function(t,r){var s=t.points;if(0!=s.length){var a=new o.Point(s[0],s[1]),h=new o.Point(s[s.length-2],s[s.length-1]);if(a.x==h.x&&a.y==h.y){s.pop(),s.pop(),h=new o.Point(s[s.length-2],s[s.length-1]);var l=h.x+.5*(a.x-h.x),u=h.y+.5*(a.y-h.y);s.unshift(l,u),s.push(l,u)}var c=r.points,d=s.length/2,p=t.lineWidth/2,f=e(t.lineColor),v=t.lineAlpha,m=f[0]*v,g=f[1]*v,x=f[2]*v,b=new o.Point(s[0],s[1]),y=new o.Point(s[2],s[3]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(r.lastPosition.x,r.lastPosition.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y,1,1,1,1),c.push(s[0]-T.x,s[1]-T.y),c.push(m,g,x,v),c.push(s[0]+T.x,s[1]+T.y),c.push(m,g,x,v);for(var _=1;d-1>_;_++){var b=new o.Point(s[2*(_-1)],s[2*(_-1)+1]),y=new o.Point(s[2*_],s[2*_+1]),A=new o.Point(s[2*(_+1)],s[2*(_+1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p;var R=i(y,A),S=Math.sqrt(R.x*R.x+R.y*R.y);R.x/=S,R.y/=S,R.x*=p,R.y*=p;var L=new o.Point(-T.x+y.x,-T.y+y.y),C=new o.Point(-T.x+b.x,-T.y+b.y),E=new o.Point(-R.x+y.x,-R.y+y.y),B=new o.Point(-R.x+A.x,-R.y+A.y),F=n(L,C,E,B),G=(F.x-y.x)*(F.x-y.x)+(F.y-y.y)+(F.y-y.y);if(G>19600){var P=new o.Point(T.x-R.x,T.y-R.y),I=Math.sqrt(P.x*P.x+P.y*P.y);P.x/=I,P.y/=I,P.x*=p,P.y*=p,c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v),c.push(y.x+P.x,y.y+P.y),c.push(m,g,x,v),c.push(y.x-P.x,y.y-P.y),c.push(m,g,x,v)}else c.push(F.x,F.y),c.push(m,g,x,v),c.push(y.x-(F.x-y.x),y.y-(F.y-y.y)),c.push(m,g,x,v)}var b=new o.Point(s[2*(d-2)],s[2*(d-2)+1]),y=new o.Point(s[2*(d-1)],s[2*(d-1)+1]),T=i(b,y),w=Math.sqrt(T.x*T.x+T.y*T.y);T.x/=w,T.y/=w,T.x*=p,T.y*=p,c.push(y.x-T.x,y.y-T.y),c.push(m,g,x,v),c.push(y.x+T.x,y.y+T.y),c.push(m,g,x,v),r.lastPosition.x=y.x+T.x,r.lastPosition.y=y.y+T.y}},o.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],o.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat4 uMVMatrix;","varying vec4 vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vColor = aColor;","}"],o.WebGLGraphics.initShaders=function(){var t=o.gl,e=o.CompileFragmentShader(t,o.primitiveShaderFragmentSrc),i=o.CompileVertexShader(t,o.primitiveShaderVertexSrc);o.shaderProgram2=t.createProgram();var r=o.shaderProgram2;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"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix")},o._defaultFrame=new o.Rectangle(0,0,1,1),o.gl,o.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 n=this;this.view.addEventListener("webglcontextlost",function(t){n.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){n.handleContextRestored(t)},!1),this.batchs=[];try{o.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(s){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}o.WebGLGraphics.initShaders(),this.initShaders();var a=this.gl;o.WebGLRenderer.gl=a,this.batch=new o.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=o.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new o.WebGLRenderGroup(this.gl)},o.WebGLRenderer.constructor=o.WebGLRenderer,o.WebGLRenderer.getBatch=function(){return 0==o._batchs.length?new o.WebGLBatch(o.WebGLRenderer.gl):o._batchs.pop()},o.WebGLRenderer.returnBatch=function(t){t.clean(),o._batchs.push(t)},o.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=o.CompileFragmentShader(t,o.shaderFragmentSrc),i=o.CompileVertexShader(t,o.shaderVertexSrc);o.shaderProgram=t.createProgram();var r=o.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"),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),r.colorAttribute=t.getAttribLocation(r,"aColor"),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),o.activateDefaultShader()},o.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),o.WebGLRenderer.updateTextures(),t.updateTransform(); -var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),o.projectionMatrix=this.projectionMatrix,this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(this.projectionMatrix),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),o.Texture.frameUpdates.length>0){for(var i=0;o.Texture.frameUpdates.length>i;i++)o.Texture.frameUpdates[i].updateFrame=!1;o.Texture.frameUpdates=[]}}},o.WebGLRenderer.updateTextures=function(){for(var t=0;o.texturesToUpdate.length>t;t++)this.updateTexture(o.texturesToUpdate[t]);for(var t=0;o.texturesToDestroy.length>t;t++)this.destroyTexture(o.texturesToDestroy[t]);o.texturesToUpdate=[],o.texturesToDestroy=[]},o.WebGLRenderer.updateTexture=function(t){var e=o.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))},o.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},o.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},o.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},o.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;o.TextureCache.length>t;t++)this.updateTexture(o.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;o._restoreBatchs(this.gl),this.contextLost=!1},o._batchs=[],o._getBatch=function(t){return 0==o._batchs.length?new o.WebGLBatch(t):o._batchs.pop()},o._returnBatch=function(t){t.clean(),o._batchs.push(t)},o._restoreBatchs=function(t){for(var e=0;o._batchs.length>e;e++)o._batchs[e].restoreLostContext(t)},o.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=o.blendModes.NORMAL,this.dynamicSize=1},o.WebGLBatch.constructor=o.WebGLBatch,o.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},o.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},o.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()},o.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},o.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},o.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)},o.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new o.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},o.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},o.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},o.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof o.WebGLBatch?this.batchs[r].render():i instanceof o.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof o.Strip?i.visible&&this.renderStrip(i,t):i instanceof o.Graphics&&i.visible&&o.WebGLGraphics.renderGraphics(i)},o.WebGLRenderGroup.prototype.renderSpecific=function(t,e){o.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(o.shaderProgram.mvMatrixUniform,!1,e);var r,n,s,a,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof o.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof o.Sprite){c=d.batch;var u=c.head;if(u==d)s=0;else for(s=1;u.__next!=d;)s++,u=u.__next}else c=d;if(l==c)return l instanceof o.WebGLBatch?l.render(r,s+1):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable),void 0;n=this.batchs.indexOf(l),a=this.batchs.indexOf(c),l instanceof o.WebGLBatch?l.render(r):l instanceof o.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof o.Strip?l.visible&&this.renderStrip(l,e):l instanceof o.CustomRenderable?l.visible&&l.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);for(var f=n+1;a>f;f++)renderable=this.batchs[f],renderable instanceof o.WebGLBatch?this.batchs[f].render():renderable instanceof o.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof o.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof o.CustomRenderable?renderable.visible&&renderable.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable);c instanceof o.WebGLBatch?c.render(0,s+1):c instanceof o.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof o.Strip?c.visible&&this.renderStrip(c):c instanceof o.CustomRenderable?c.visible&&c.renderWebGL(this,e):renderable instanceof o.Graphics&&renderable.visible&&o.WebGLGraphics.renderGraphics(renderable)},o.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},o.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i-1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(0,0,n)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),s=this.batchs[i+1];if(e.remove(t),s){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,s.head),void 0;var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.splice(i+1,0,n)}else{var n=o.WebGLRenderer.getBatch();n.init(t),this.batchs.push(n)}}else{var e=t.batch,a=e.split(t);a.remove(t);var n=o.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);n.init(t),this.batchs.splice(i+1,0,n,a)}},o.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof o.Sprite){var r,n;if(e instanceof o.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 o.Sprite){if(n=i.batch){if(n.texture==t.texture.baseTexture&&n.blendMode==t.blendMode)return n.insertBefore(t,i),void 0;if(n==r){var s=r.split(i),a=o.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(h+1,0,a,s),void 0}}}else n=i;var a=o.WebGLRenderer.getBatch();if(a.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,a)}else this.batchs.push(a)}else t instanceof o.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof o.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof o.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},o.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},o.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof o.WebGLBatch&&this.batchs[r+1]instanceof o.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 o.WebGLBatch&&o.WebGLRenderer.returnBatch(e),o.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof o.WebGLBatch&&o.WebGLRenderer.returnBatch(e)}}},o.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])}},o.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},o.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},o.WebGLRenderGroup.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},o.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=o.shaderProgram,n=o.mat3.toMat4(t.worldTransform);o.mat4.transpose(n),o.mat4.multiply(e,n,n),i.uniformMatrix4fv(r.mvMatrixUniform,!1,n),t.blendMode==o.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},o.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;o.shaderProgram;var r=t.tilePosition,n=t.tileScale,s=r.x/t.texture.baseTexture.width,a=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/n.x,l=t.height/t.texture.baseTexture.height/n.y;t.uvs[0]=0-s,t.uvs[1]=0-a,t.uvs[2]=1*h-s,t.uvs[3]=0-a,t.uvs[4]=1*h-s,t.uvs[5]=1*l-a,t.uvs[6]=0-s,t.uvs[7]=1*l-a,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},o.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)},o.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")},o.CanvasRenderer.constructor=o.CanvasRenderer,o.CanvasRenderer.prototype.render=function(t){o.texturesToUpdate=[],o.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))),o.Texture.frameUpdates.length>0&&(o.Texture.frameUpdates=[])},o.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},o.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof o.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof o.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof o.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof o.CustomRenderable?t.renderCanvas(this):t instanceof o.Graphics&&o.CanvasGraphics.renderGraphics(t,i);if(t.children)for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},o.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},o.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()},o.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,m=r[a+1]*t.texture.height,g=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*g+m*v+f*x-g*v-m*f-p*x,y=o*g+m*l+h*x-g*l-m*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*g*l+m*h*v+o*f*x-o*g*v-m*f*l-p*h*x,_=u*g+m*d+c*x-g*d-m*c-u*x,A=p*c+u*v+f*d-c*v-u*f-p*d,R=p*g*d+m*c*v+u*f*x-u*g*v-m*f*d-p*c*x;e.transform(y/b,_/b,T/b,A/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},o.CanvasGraphics=function(){},o.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],n=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,e.globalAlpha=r.lineAlpha,r.type==o.Graphics.POLY){if(0>=r.lineWidth)continue;e.beginPath(),e.moveTo(n[0],n[1]);for(var s=1;n.length/2>s;s++)e.lineTo(n[2*s],n[2*s+1]);n[0]==n[n.length-2]&&n[1]==n[n.length-1]&&e.closePath(),e.stroke()}else r.type==o.Graphics.RECT?(r.fillColor&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(n[0],n[1],n[2],n[3])),r.lineWidth&&e.strokeRect(n[0],n[1],n[2],n[3])):r.type==o.Graphics.CIRC&&(e.beginPath(),e.arc(n[0],n[1],n[2],0,2*Math.PI),e.closePath(),r.fill&&(e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&e.stroke())}},o.Graphics=function(){o.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[]},o.Graphics.POLY=0,o.Graphics.RECT=1,o.Graphics.CIRC=2,o.Graphics.constructor=o.Graphics,o.Graphics.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Graphics.prototype.lineStyle=function(t,e,i){this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.graphicsData.push(this.currentPath)},o.Graphics.prototype.moveTo=function(t,e){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,points:[],type:o.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},o.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},o.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},o.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},o.Graphics.prototype.updateTransform=function(){this.visible&&o.DisplayObject.prototype.updateTransform.call(this)},o.Graphics.prototype.drawRect=function(t,e,i,r){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:o.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.drawCircle=function(t,e,i){this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i],type:o.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},o.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},o.Strip=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=o.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},o.Strip.constructor=o.Strip,o.Strip.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},o.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Rope=function(t,e){o.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()},o.Rope.constructor=o.Rope,o.Rope.prototype=Object.create(o.Strip.prototype),o.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},o.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],n={x:0,y:0},s=t[0];this.count-=.2,i[0]=s.x+n.x,i[1]=s.y+n.y,i[2]=s.x-n.x,i[3]=s.y-n.y;for(var a=t.length,h=1;a>h;h++){var s=t[h],l=4*h;e=t.length-1>h?t[h+1]:s,n.y=-(e.x-r.x),n.x=e.y-r.y;var u=10*(1-h/(a-1));u>1&&(u=1);var c=Math.sqrt(n.x*n.x+n.y*n.y),d=this.texture.height/2;n.x/=c,n.y/=c,n.x*=d,n.y*=d,i[l]=s.x+n.x,i[l+1]=s.y+n.y,i[l+2]=s.x-n.x,i[l+3]=s.y-n.y,r=s}o.DisplayObjectContainer.prototype.updateTransform.call(this)}},o.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite=function(t,e,i){o.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new o.Point(1,1),this.tilePosition=new o.Point(0,0),this.blendMode=o.blendModes.NORMAL},o.TilingSprite.constructor=o.TilingSprite,o.TilingSprite.prototype=Object.create(o.DisplayObjectContainer.prototype),o.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},o.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},o.Spine=function(t){if(o.DisplayObjectContainer.call(this),this.spineData=o.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new d.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new d.AnimationStateData(this.spineData),this.state=new d.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;o.TextureCache[i]||(i+=".png");var r=new o.Sprite(o.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},o.Spine.constructor=o.Spine,o.Spine.prototype=Object.create(o.DisplayObjectContainer.prototype),o.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var n=e.attachment.name;o.TextureCache[n]||(n+=".png"),this.sprites[t].setTexture(o.TextureCache[n]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}o.DisplayObjectContainer.prototype.updateTransform.call(this)};var d={};d.BoneData=function(t,e){this.name=t,this.parent=e},d.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},d.SlotData=function(t,e){this.name=t,this.boneData=e},d.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},d.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},d.Bone.yDown=!1,d.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),d.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},d.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},d.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null); -break}}},d.Skin=function(t){this.name=t,this.attachments={}},d.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},d.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},d.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},d.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},d.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},d.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},d.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,m=6*t,g=this.curves;g[m]=e*h+d*l+f*o,g[m+1]=i*h+p*l+v*o,g[m+2]=d*u+f*c,g[m+3]=p*u+v*c,g[m+4]=f*c,g[m+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},d.RotateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=2*t},d.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=d.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},d.TranslateTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},d.ScaleTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=3*t},d.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=d.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},d.ColorTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=5*t},d.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=d.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],u=r[a-1],c=r[a],p=1-(e-c)/(r[a-5]-c);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,m=l+(r[a+3]-l)*p,g=u+(r[a+4]-u)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(m-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=v,n.b=m,n.a=g)}}},d.AttachmentTimeline=function(t){this.curves=new d.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},d.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:d.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},d.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},d.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},d.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new d.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new d.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},d.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},d.AttachmentType={region:0},d.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},d.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,m=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-m,g[3]=v+u,g[4]=p-m,g[5]=v+f,g[6]=p-d,g[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},d.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},d.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},d.AnimationState=function(t){this.data=t,this.queue=[]},d.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},d.SkeletonJson=function(t){this.attachmentLoader=t},d.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new d.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new d.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var u=new d.SlotData(l.name,o),c=l.color;c&&(u.r=d.SkeletonJson.toColor(c,0),u.g=d.SkeletonJson.toColor(c,1),u.b=d.SkeletonJson.toColor(c,2),u.a=d.SkeletonJson.toColor(c,3)),u.attachmentName=l.attachment,e.slots.push(u)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],m=new d.Skin(f);for(var g in v)if(v.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=v[g];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(m,y,b[y]);null!=T&&m.addAttachment(x,y,T)}}e.skins.push(m),"default"==m.name&&(e.defaultSkin=m)}var w=t.animations;for(var _ in w)w.hasOwnProperty(_)&&this.readAnimation(_,w[_],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=d.AttachmentType[i.type||"region"],n=new d.RegionAttachment;return n.name=e,r==d.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var u=h[l];if("rotate"==l){var c=new d.RotateTimeline(u.length);c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p,m.time,m.angle),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[2*c.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var c,g=1;"scale"==l?c=new d.ScaleTimeline(u.length):(c=new d.TranslateTimeline(u.length),g=this.scale),c.boneIndex=o;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],x=(m.x||0)*g,b=(m.y||0)*g;c.setFrame(p,m.time,x,b),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[3*c.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],_=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var u=w[l];if("color"==l){var c=new d.ColorTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f],A=m.color,R=d.SkeletonJson.toColor(A,0),S=d.SkeletonJson.toColor(A,1),L=d.SkeletonJson.toColor(A,2),C=d.SkeletonJson.toColor(A,3);c.setFrame(p,m.time,R,S,L,C),d.SkeletonJson.readCurve(c,p,m),p++}r.push(c),n=Math.max(n,c.frames[5*c.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var c=new d.AttachmentTimeline(u.length);c.slotIndex=_;for(var p=0,f=0,v=u.length;v>f;f++){var m=u[f];c.setFrame(p++,m.time,m.name)}r.push(c),n=Math.max(n,c.frames[Math.floor(c.getFrameCount())-1])}}}i.animations.push(new d.Animation(t,r,n))}},d.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},d.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},d.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new d.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new d.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),u=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+u)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+u)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(u),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new d.AtlasPage,n.name=s,n.format=d.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=d.Atlas.TextureFilter[r[0]],n.magFilter=d.Atlas.TextureFilter[r[1]];var c=i.readValue();n.uWrap=d.Atlas.TextureWrap.clampToEdge,n.vWrap=d.Atlas.TextureWrap.clampToEdge,"x"==c?n.uWrap=d.Atlas.TextureWrap.repeat:"y"==c?n.vWrap=d.Atlas.TextureWrap.repeat:"xy"==c&&(n.uWrap=n.vWrap=d.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},d.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},d.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},d.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},d.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},d.AtlasPage=function(){},d.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},d.AtlasRegion=function(){},d.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},d.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},d.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},d.AtlasAttachmentLoader=function(t){this.atlas=t},d.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case d.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new d.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},o.AnimCache={},d.Bone.yDown=!0,o.CustomRenderable=function(){o.DisplayObject.call(this)},o.CustomRenderable.constructor=o.CustomRenderable,o.CustomRenderable.prototype=Object.create(o.DisplayObject.prototype),o.CustomRenderable.prototype.renderCanvas=function(){},o.CustomRenderable.prototype.initWebGL=function(){},o.CustomRenderable.prototype.renderWebGL=function(){},o.BaseTextureCache={},o.texturesToUpdate=[],o.texturesToDestroy=[],o.BaseTexture=function(t){if(o.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,o.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,o.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,o.texturesToUpdate.push(this);this._powerOf2=!1}},o.BaseTexture.constructor=o.BaseTexture,o.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,o.texturesToDestroy.push(this)},o.BaseTexture.fromImage=function(t,e){var i=o.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new o.BaseTexture(r),o.BaseTextureCache[t]=i}return i},o.TextureCache={},o.FrameCache={},o.Texture=function(t,e){if(o.EventTarget.call(this),e||(this.noFrame=!0,e=new o.Rectangle(0,0,1,1)),this.trim=new o.Point,t instanceof o.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new o.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},o.Texture.constructor=o.Texture,o.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new o.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})},o.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},o.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,o.Texture.frameUpdates.push(this)},o.Texture.fromImage=function(t,e){var i=o.TextureCache[t];return i||(i=new o.Texture(o.BaseTexture.fromImage(t,e)),o.TextureCache[t]=i),i},o.Texture.fromFrame=function(t){var e=o.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},o.Texture.fromCanvas=function(t){var e=new o.BaseTexture(t);return new o.Texture(e)},o.Texture.addTextureToCache=function(t,e){o.TextureCache[e]=t},o.Texture.removeTextureFromCache=function(t){var e=o.TextureCache[t];return o.TextureCache[t]=null,e},o.Texture.frameUpdates=[],o.RenderTexture=function(t,e){o.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=o.mat3.create(),this.frame=new o.Rectangle(0,0,this.width,this.height),o.gl?this.initWebGL():this.initCanvas()},o.RenderTexture.constructor=o.RenderTexture,o.RenderTexture.prototype=Object.create(o.Texture.prototype),o.RenderTexture.prototype.initWebGL=function(){var t=o.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new o.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=o.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},o.RenderTexture.prototype.initCanvas=function(){this.renderer=new o.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new o.BaseTexture(this.renderer.view),this.frame=new o.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},o.RenderTexture.prototype.renderWebGL=function(t,e){var i=o.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));var r=t.children;t.worldTransform=o.mat3.create();for(var n=0,s=r.length;s>n;n++)r[n].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render(this.projectionMatrix):a.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new o.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},o.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=o.mat3.create();for(var r=0,n=i.length;n>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),o.texturesToUpdate.push(this.baseTexture)},o.AssetLoader=function(t){o.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:o.ImageLoader,jpeg:o.ImageLoader,png:o.ImageLoader,gif:o.ImageLoader,json:o.JsonLoader,anim:o.SpineLoader,xml:o.BitmapFontLoader,fnt:o.BitmapFontLoader}},o.AssetLoader.constructor=o.AssetLoader,o.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},o.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())},o.JsonLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},o.JsonLoader.constructor=o.JsonLoader,o.JsonLoader.prototype.load=function(){this.ajaxRequest=new c;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)},o.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()}else if(this.json.bones){var a=new d.SkeletonJson,h=a.readSkeletonData(this.json);o.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},o.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},o.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},o.SpriteSheetLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},o.SpriteSheetLoader.constructor=o.SpriteSheetLoader,o.SpriteSheetLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new o.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var n in r){var s=r[n].frame;s&&(o.TextureCache[n]=new o.Texture(this.texture,{x:s.x,y:s.y,width:s.w,height:s.h}),r[n].trimmed&&(o.TextureCache[n].realSize=r[n].spriteSourceSize,o.TextureCache[n].trim.x=0))}i.load()},o.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.ImageLoader=function(t,e){o.EventTarget.call(this),this.texture=o.Texture.fromImage(t,e)},o.ImageLoader.constructor=o.ImageLoader,o.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},o.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.BitmapFontLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},o.BitmapFontLoader.constructor=o.BitmapFontLoader,o.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)},o.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 o.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],n=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(n.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var s=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;s.length>a;a++){var h=parseInt(s[a].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(s[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(s[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(s[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(s[a].attributes.getNamedItem("height").nodeValue,10)};o.TextureCache[h]=new o.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(s[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(s[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(s[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new o.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var c=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}o.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},o.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},o.SpineLoader=function(t,e){o.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},o.SpineLoader.constructor=o.SpineLoader,o.SpineLoader.prototype.load=function(){new o.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},o.SpineLoader.prototype.load=function(){var t=this,e=new o.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},o.SpineLoader.prototype.onJSONLoaded=function(){var t=new d.SkeletonJson,e=t.readSkeletonData(this.json);o.AnimCache[this.url]=e,this.onLoaded()},o.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=o),exports.PIXI=o):s.PIXI=o}).call(this); \ No newline at end of file +(function(){function t(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}var i=this,n=n||{};n.Point=function(t,e){this.x=t||0,this.y=e||0},n.Point.prototype.clone=function(){return new n.Point(this.x,this.y)},n.Point.constructor=n.Point,n.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},n.Rectangle.prototype.clone=function(){return new n.Rectangle(this.x,this.y,this.width,this.height)},n.Rectangle.constructor=n.Rectangle,n.Polygon=function(t){this.points=t},n.Polygon.clone=function(){for(var t=[],e=0;this.points.length>e;e++)t.push(this.points[e].clone());return new n.Polygon(t)},n.Polygon.constructor=n.Polygon,t(),n.mat3={},n.mat3.create=function(){var t=new n.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},n.mat4={},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=e[0],p=e[1],f=e[2],v=e[3],g=e[4],m=e[5],x=e[6],b=e[7],y=e[8];return i[0]=d*r+p*a+f*l,i[1]=d*n+p*o+f*u,i[2]=d*s+p*h+f*c,i[3]=v*r+g*a+m*l,i[4]=v*n+g*o+m*u,i[5]=v*s+g*h+m*c,i[6]=x*r+b*a+y*l,i[7]=x*n+b*o+y*u,i[8]=x*s+b*h+y*c,i},n.mat3.clone=function(t){var e=new n.Matrix(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},n.mat3.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=i,t[5]=t[7],t[6]=r,t[7]=n,t}return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],e},n.mat3.toMat4=function(t,e){return e||(e=n.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},n.mat4.create=function(){var t=new n.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],n=t[3],s=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]=s,t[11]=t[14],t[12]=n,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},n.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],n=t[1],s=t[2],a=t[3],o=t[4],h=t[5],l=t[6],u=t[7],c=t[8],d=t[9],p=t[10],f=t[11],v=t[12],g=t[13],m=t[14],x=t[15],b=e[0],y=e[1],T=e[2],w=e[3];return i[0]=b*r+y*o+T*c+w*v,i[1]=b*n+y*h+T*d+w*g,i[2]=b*s+y*l+T*p+w*m,i[3]=b*a+y*u+T*f+w*x,b=e[4],y=e[5],T=e[6],w=e[7],i[4]=b*r+y*o+T*c+w*v,i[5]=b*n+y*h+T*d+w*g,i[6]=b*s+y*l+T*p+w*m,i[7]=b*a+y*u+T*f+w*x,b=e[8],y=e[9],T=e[10],w=e[11],i[8]=b*r+y*o+T*c+w*v,i[9]=b*n+y*h+T*d+w*g,i[10]=b*s+y*l+T*p+w*m,i[11]=b*a+y*u+T*f+w*x,b=e[12],y=e[13],T=e[14],w=e[15],i[12]=b*r+y*o+T*c+w*v,i[13]=b*n+y*h+T*d+w*g,i[14]=b*s+y*l+T*p+w*m,i[15]=b*a+y*u+T*f+w*x,i},n.DisplayObject=function(){this.position=new n.Point,this.scale=new n.Point(1,1),this.pivot=new n.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=n.mat3.create(),this.localTransform=n.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.childIndex=0,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},n.DisplayObject.constructor=n.DisplayObject,n.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},n.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,n=this.pivot.y;t[2]=this.position.x-t[0]*r-n*t[1],t[5]=this.position.y-t[4]*n-r*t[3];var s=t[0],a=t[1],o=t[2],h=t[3],l=t[4],u=t[5],c=e[0],d=e[1],p=e[2],f=e[3],v=e[4],g=e[5];i[0]=c*s+d*h,i[1]=c*a+d*l,i[2]=c*o+d*u+p,i[3]=f*s+v*h,i[4]=f*a+v*l,i[5]=f*o+v*u+g,this.worldAlpha=this.alpha*this.parent.worldAlpha},n.DisplayObjectContainer=function(){n.DisplayObject.call(this),this.children=[],this.renderable=!1},n.DisplayObjectContainer.constructor=n.DisplayObjectContainer,n.DisplayObjectContainer.prototype=Object.create(n.DisplayObject.prototype),n.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))},n.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&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},n.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},n.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)},n.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},n.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){n.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},n.blendModes={},n.blendModes.NORMAL=0,n.blendModes.SCREEN=1,n.Sprite=function(t){n.DisplayObjectContainer.call(this),this.anchor=new n.Point,this.texture=t,this.blendMode=n.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},n.Sprite.constructor=n.Sprite,n.Sprite.prototype=Object.create(n.DisplayObjectContainer.prototype),Object.defineProperty(n.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(n.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}}),n.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},n.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},n.Sprite.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new n.Sprite(e)},n.Sprite.fromImage=function(t){var e=n.Texture.fromImage(t);return new n.Sprite(e)},n.MovieClip=function(t){n.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},n.MovieClip.constructor=n.MovieClip,n.MovieClip.prototype=Object.create(n.Sprite.prototype),n.MovieClip.prototype.stop=function(){this.playing=!1},n.MovieClip.prototype.play=function(){this.playing=!0},n.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])},n.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},n.MovieClip.prototype.updateTransform=function(){if(n.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())}},n.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),n.Sprite.call(this,n.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.Text.constructor=n.Text,n.Text.prototype=Object.create(n.Sprite.prototype),n.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.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},n.Sprite.prototype.setText=function(t){this.text=""+t||" ",this.dirty=!0},n.Text.prototype.updateText=function(){this.context.font=this.style.font;var t=this.text;this.style.wordWrap&&(t=this.wordWrap(this.text));for(var e=t.split(/(?:\r\n|\r|\n)/),i=[],r=0,s=0;e.length>s;s++){var a=this.context.measureText(e[s]).width;i[s]=a,r=Math.max(r,a)}this.canvas.width=r+this.style.strokeThickness;var o=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=o*e.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",s=0;e.length>s;s++){var h=new n.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+s*o);"right"==this.style.align?h.x+=r-i[s]:"center"==this.style.align&&(h.x+=(r-i[s])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(e[s],h.x,h.y),this.style.fill&&this.context.fillText(e[s],h.x,h.y)}this.updateTexture()},n.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,this._width=this.canvas.width,this._height=this.canvas.height,n.texturesToUpdate.push(this.texture.baseTexture)},n.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),n.Sprite.prototype.updateTransform.call(this)},n.Text.prototype.determineFontHeight=function(t){var e=n.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+";position:absolute;top:0;left:0"),i.appendChild(r),e=r.offsetHeight,n.Text.heightCache[t]=e,i.removeChild(r)}return e},n.Text.prototype.wordWrap=function(t){for(var e=function(t,e,i,r,n){var s=Math.floor((r-i)/2)+i;return s==i?1:n>=t.measureText(e.substring(0,s)).width?t.measureText(e.substring(0,s+1)).width>n?s:arguments.callee(t,e,s,r,n):arguments.callee(t,e,i,s,n)},i=function(t,i,r){if(r>=t.measureText(i).width||1>i.length)return i;var n=e(t,i,0,i.length,r);return i.substring(0,n)+"\n"+arguments.callee(t,i.substring(n),r)},r="",n=t.split("\n"),s=0;n.length>s;s++)r+=i(this.context,n[s],this.style.wordWrapWidth)+"\n";return r},n.Text.prototype.destroy=function(t){t&&this.texture.destroy()},n.Text.heightCache={},n.BitmapText=function(t,e){n.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},n.BitmapText.constructor=n.BitmapText,n.BitmapText.prototype=Object.create(n.DisplayObjectContainer.prototype),n.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},n.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):n.BitmapText.fonts[this.fontName].size,this.dirty=!0},n.BitmapText.prototype.updateText=function(){for(var t=n.BitmapText.fonts[this.fontName],e=new n.Point,i=null,r=[],s=0,a=[],o=0,h=this.fontSize/t.size,l=0;this.text.length>l;l++){var u=this.text.charCodeAt(l);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(l)))a.push(e.x),s=Math.max(s,e.x),o++,e.x=0,e.y+=t.lineHeight,i=null;else{var c=t.chars[u];c&&(i&&c[i]&&(e.x+=c.kerning[i]),r.push({texture:c.texture,line:o,charCode:u,position:new n.Point(e.x+c.xOffset,e.y+c.yOffset)}),e.x+=c.xAdvance,i=u)}}a.push(e.x),s=Math.max(s,e.x);var d=[];for(l=0;o>=l;l++){var p=0;"right"==this.style.align?p=s-a[l]:"center"==this.style.align&&(p=(s-a[l])/2),d.push(p)}for(l=0;r.length>l;l++){var f=new n.Sprite(r[l].texture);f.position.x=(r[l].position.x+d[r[l].line])*h,f.position.y=r[l].position.y*h,f.scale.x=f.scale.y=h,this.addChild(f)}this.width=e.x*h,this.height=(e.y+t.lineHeight)*h},n.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}n.DisplayObjectContainer.prototype.updateTransform.call(this)},n.BitmapText.fonts={},n.InteractionManager=function(t){this.stage=t,this.tempPoint=new n.Point,this.mouseoverEnabled=!0,this.mouse=new n.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},n.InteractionManager.constructor=n.InteractionManager,n.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,n=r-1;n>=0;n--){var s=i[n];s.visible&&(s.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(s),s.children.length>0&&this.collectInteractiveSprite(s,s)):(s.__iParent=null,s.children.length>0&&this.collectInteractiveSprite(s,e)))}},n.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)},n.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;for(var i=this.interactiveItems.length,r=0;i>r;r++)this.interactiveItems[r].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var n=this.interactiveItems.length;this.target.view.style.cursor="default";for(var r=0;n>r;r++){var s=this.interactiveItems[r];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))}}}},n.InteractionManager.prototype.onMouseMove=function(t){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 n=this.interactiveItems[r];n.mousemove&&n.mousemove(this.mouse)}},n.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}},n.InteractionManager.prototype.onMouseUp=function(){this.mouse.global;for(var t=this.interactiveItems.length,e=!1,i=0;t>i;i++){var r=this.interactiveItems[i];(r.mouseup||r.mouseupoutside||r.click)&&(r.__hit=this.hitTest(r,this.mouse),r.__hit&&!e?(r.mouseup&&r.mouseup(this.mouse),r.__isDown&&r.click&&r.click(this.mouse),r.interactiveChildren||(e=!0)):r.__isDown&&r.mouseupoutside&&r.mouseupoutside(this.mouse),r.__isDown=!1)}},n.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;var r=t instanceof n.Sprite,s=t.worldTransform,a=s[0],o=s[1],h=s[2],l=s[3],u=s[4],c=s[5],d=1/(a*u+o*-l),p=u*d*i.x+-o*d*i.y+(c*o-h*u)*d,f=a*d*i.y+-l*d*i.x+(-c*a+h*l)*d;if(t.hitArea){var v=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var g=!1,m=0,x=t.hitArea.points.length-1;t.hitArea.points.length>m;x=m++){var b=t.hitArea.points[m].x,y=t.hitArea.points[m].y,T=t.hitArea.points[x].x,w=t.hitArea.points[x].y,A=y>f!=w>f&&(T-b)*(f-y)/(w-y)+b>p;A&&(g=!g)}if(g)return r&&(e.target=t),!0}else{var _=v.x;if(p>_&&_+v.width>p){var R=v.y;if(f>R&&R+v.height>f)return r&&(e.target=t),!0}}}else if(r){var R,S=t.texture.frame.width,C=t.texture.frame.height,_=-S*t.anchor.x;if(p>_&&_+S>p&&(R=-C*t.anchor.y,f>R&&R+C>f))return e.target=t,!0}for(var L=t.children.length,m=0;L>m;m++){var E=t.children[m],B=this.hitTest(E,e);if(B)return!0}return!1},n.InteractionManager.prototype.onTouchMove=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier];s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.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(s)}},n.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],a=this.pool.pop();a||(a=new n.InteractionData),this.touchs[s.identifier]=a,a.global.x=(s.clientX-e.left)*(this.target.width/e.width),a.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h];if((l.touchstart||l.tap)&&(l.__hit=this.hitTest(l,a),l.__hit&&(l.touchstart&&l.touchstart(a),l.__isDown=!0,l.__touchData=a,!l.interactiveChildren)))break}}},n.InteractionManager.prototype.onTouchEnd=function(t){for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var n=i[r],s=this.touchs[n.identifier],a=!1;s.global.x=(n.clientX-e.left)*(this.target.width/e.width),s.global.y=(n.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var l=this.interactiveItems[h],u=l.__touchData;l.__hit=this.hitTest(l,s),u==s&&((l.touchend||l.tap)&&(l.__hit&&!a?(l.touchend&&l.touchend(s),l.__isDown&&l.tap&&l.tap(s),l.interactiveChildren||(a=!0)):l.__isDown&&l.touchendoutside&&l.touchendoutside(s),l.__isDown=!1),l.__touchData=null)}this.pool.push(s),this.touchs[n.identifier]=null}},n.InteractionData=function(){this.global=new n.Point,this.local=new n.Point,this.target},n.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],a=e[2],o=e[3],h=e[4],l=e[5],u=1/(r*h+s*-o);return new n.Point(h*u*i.x+-s*u*i.y+(l*s-a*h)*u,r*u*i.y+-o*u*i.x+(-l*r+a*o)*u)},n.InteractionData.constructor=n.InteractionData,n.Stage=function(t,e){n.DisplayObjectContainer.call(this),this.worldTransform=n.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new n.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new n.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0,this.stage.dirty=!0},n.Stage.constructor=n.Stage,n.Stage.prototype=Object.create(n.DisplayObjectContainer.prototype),n.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()},n.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=e(this.backgroundColor);var i=this.backgroundColor.toString(16);i="000000".substr(0,6-i.length)+i,this.backgroundColorString="#"+i},n.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},n.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])},n.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])};for(var s=0,o=["ms","moz","webkit","o"],h=0;o.length>h&&!window.requestAnimationFrame;++h)window.requestAnimationFrame=window[o[h]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[o[h]+"CancelAnimationFrame"]||window[o[h]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-s)),r=window.setTimeout(function(){t(e+i)},i);return s=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)}),window.requestAnimFrame=window.requestAnimationFrame,"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var s=n.concat(t.call(arguments));r.apply(this instanceof i?this:e,s)}var r=this,n=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function s(t){return t&&(s.prototype=t),this instanceof s?void 0:new s}(r.prototype),i}}());var l=n.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){}};n.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)}},n.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 n.WebGLRenderer(t,e,i,r):new n.CanvasRenderer(t,e,i,r)},n.PolyK={},n.PolyK.Triangulate=function(t){var e=!0,i=t.length>>1;if(3>i)return[];for(var r=[],s=[],a=0;i>a;a++)s.push(a);for(var a=0,o=i;o>3;){var h=s[(a+0)%o],l=s[(a+1)%o],u=s[(a+2)%o],c=t[2*h],d=t[2*h+1],p=t[2*l],f=t[2*l+1],v=t[2*u],g=t[2*u+1],m=!1;if(n.PolyK._convex(c,d,p,f,v,g,e)){m=!0;for(var x=0;o>x;x++){var b=s[x];if(b!=h&&b!=l&&b!=u&&n.PolyK._PointInTriangle(t[2*b],t[2*b+1],c,d,p,f,v,g)){m=!1;break}}}if(m)r.push(h,l,u),s.splice((a+1)%o,1),o--,a=0;else if(a++>3*o){if(!e)return[];var r=[];s=[];for(var a=0;i>a;a++)s.push(a);a=0,o=i,e=!1}}return r.push(s[0],s[1],s[2]),r},n.PolyK._PointInTriangle=function(t,e,i,r,n,s,a,o){var h=a-i,l=o-r,u=n-i,c=s-r,d=t-i,p=e-r,f=h*h+l*l,v=h*u+l*c,g=h*d+l*p,m=u*u+c*c,x=u*d+c*p,b=1/(f*m-v*v),y=(m*g-v*x)*b,T=(f*x-v*g)*b;return y>=0&&T>=0&&1>y+T},n.PolyK._convex=function(t,e,i,r,n,s,a){return(e-r)*(n-i)+(i-t)*(s-r)>=0==a},n.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;","}"],n.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.stripShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],n.primitiveShaderFragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","gl_FragColor = vColor;","}"],n.primitiveShaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","varying vec4 vColor;","void main(void) {","vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);","gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","vColor = aColor;","}"],n.initPrimitiveShader=function(){var t=n.gl,e=n.compileProgram(n.primitiveShaderVertexSrc,n.primitiveShaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),n.primitiveProgram=e},n.initDefaultShader=function(){var t=this.gl,e=n.compileProgram(n.shaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.mvMatrixUniform=t.getUniformLocation(e,"uMVMatrix"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.shaderProgram=e},n.initDefaultStripShader=function(){var t=this.gl,e=n.compileProgram(n.stripShaderVertexSrc,n.shaderFragmentSrc);t.useProgram(e),e.vertexPositionAttribute=t.getAttribLocation(e,"aVertexPosition"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.textureCoordAttribute=t.getAttribLocation(e,"aTextureCoord"),e.translationMatrix=t.getUniformLocation(e,"translationMatrix"),e.colorAttribute=t.getAttribLocation(e,"aColor"),e.projectionVector=t.getUniformLocation(e,"projectionVector"),e.samplerUniform=t.getUniformLocation(e,"uSampler"),n.stripShaderProgram=e},n.CompileVertexShader=function(t,e){return n._CompileShader(t,e,t.VERTEX_SHADER)},n.CompileFragmentShader=function(t,e){return n._CompileShader(t,e,t.FRAGMENT_SHADER)},n._CompileShader=function(t,e,i){var r=e.join("\n"),n=t.createShader(i);return t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.activateDefaultShader=function(){var t=n.gl,e=n.shaderProgram;t.useProgram(e),t.enableVertexAttribArray(e.vertexPositionAttribute),t.enableVertexAttribArray(e.textureCoordAttribute),t.enableVertexAttribArray(e.colorAttribute)},n.compileProgram=function(t,e){var i=n.gl,r=n.CompileFragmentShader(i,e),s=n.CompileVertexShader(i,t),a=i.createProgram();return i.attachShader(a,s),i.attachShader(a,r),i.linkProgram(a),i.getProgramParameter(a,i.LINK_STATUS)||alert("Could not initialise shaders"),a},n.activatePrimitiveShader=function(){var t=n.gl;t.disableVertexAttribArray(n.shaderProgram.textureCoordAttribute),t.disableVertexAttribArray(n.shaderProgram.colorAttribute),t.useProgram(n.primitiveProgram),t.enableVertexAttribArray(n.primitiveProgram.vertexPositionAttribute),t.enableVertexAttribArray(n.primitiveProgram.colorAttribute)},n.WebGLGraphics=function(){},n.WebGLGraphics.constructor=n.WebGLGraphics,n.WebGLGraphics.renderGraphics=function(t,e){n.activatePrimitiveShader();var i=n.gl;t._webGL||(t._webGL={points:[],indices:[],lastIndex:0,buffer:i.createBuffer(),indexBuffer:i.createBuffer()}),t.dirty&&(t.dirty=!1,t.clearDirty&&(t.clearDirty=!1,t._webGL.lastIndex=0,t._webGL.points=[]),n.WebGLGraphics.updateGraphics(t));var r=n.mat3.clone(t.worldTransform);n.mat3.transpose(r),i.uniformMatrix3fv(n.primitiveProgram.translationMatrix,!1,r),i.uniform2f(n.primitiveProgram.projectionVector,e.x,e.y),i.bindBuffer(i.ARRAY_BUFFER,t._webGL.buffer),i.vertexAttribPointer(n.primitiveProgram.vertexPositionAttribute,2,i.FLOAT,!1,24,0),i.vertexAttribPointer(n.primitiveProgram.colorAttribute,4,i.FLOAT,!1,24,8),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),i.drawElements(i.TRIANGLE_STRIP,t._webGL.indices.length,i.UNSIGNED_SHORT,0),n.activateDefaultShader()},n.WebGLGraphics.updateGraphics=function(t){for(var e=t._webGL.lastIndex;t.graphicsData.length>e;e++){var i=t.graphicsData[e];i.type==n.Graphics.POLY?(i.fill&&i.points.length>3&&n.WebGLGraphics.buildPoly(i,t._webGL),i.lineWidth>0&&n.WebGLGraphics.buildLine(i,t._webGL)):i.type==n.Graphics.RECT?n.WebGLGraphics.buildRectangle(i,t._webGL):(i.type==n.Graphics.CIRC||i.type==n.Graphics.ELIP)&&n.WebGLGraphics.buildCircle(i,t._webGL)}t._webGL.lastIndex=t.graphicsData.length;var r=n.gl;t._webGL.glPoints=new Float32Array(t._webGL.points),r.bindBuffer(r.ARRAY_BUFFER,t._webGL.buffer),r.bufferData(r.ARRAY_BUFFER,t._webGL.glPoints,r.STATIC_DRAW),t._webGL.glIndicies=new Uint16Array(t._webGL.indices),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t._webGL.indexBuffer),r.bufferData(r.ELEMENT_ARRAY_BUFFER,t._webGL.glIndicies,r.STATIC_DRAW)},n.WebGLGraphics.buildRectangle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3];if(t.fill){var l=e(t.fillColor),u=t.fillAlpha,c=l[0]*u,d=l[1]*u,p=l[2]*u,f=i.points,v=i.indices,g=f.length/6;f.push(s,a),f.push(c,d,p,u),f.push(s+o,a),f.push(c,d,p,u),f.push(s,a+h),f.push(c,d,p,u),f.push(s+o,a+h),f.push(c,d,p,u),v.push(g,g,g+1,g+2,g+3,g+3)}t.lineWidth&&(t.points=[s,a,s+o,a,s+o,a+h,s,a+h,s,a],n.WebGLGraphics.buildLine(t,i))},n.WebGLGraphics.buildCircle=function(t,i){var r=t.points,s=r[0],a=r[1],o=r[2],h=r[3],l=40,u=2*Math.PI/l;if(t.fill){var c=e(t.fillColor),d=t.fillAlpha,p=c[0]*d,f=c[1]*d,v=c[2]*d,g=i.points,m=i.indices,x=g.length/6;m.push(x);for(var b=0;l+1>b;b++)g.push(s,a,p,f,v,d),g.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h,p,f,v,d),m.push(x++,x++);m.push(x-1)}if(t.lineWidth){t.points=[];for(var b=0;l+1>b;b++)t.points.push(s+Math.sin(u*b)*o,a+Math.cos(u*b)*h);n.WebGLGraphics.buildLine(t,i)}},n.WebGLGraphics.buildLine=function(t,i){var r=t.points;if(0!=r.length){var s=new n.Point(r[0],r[1]),a=new n.Point(r[r.length-2],r[r.length-1]);if(s.x==a.x&&s.y==a.y){r.pop(),r.pop(),a=new n.Point(r[r.length-2],r[r.length-1]);var o=a.x+.5*(s.x-a.x),h=a.y+.5*(s.y-a.y);r.unshift(o,h),r.push(o,h)}var l=i.points,u=i.indices,c=r.length/2,d=r.length,p=l.length/6,f=t.lineWidth/2,v=e(t.lineColor),g=t.lineAlpha,m=v[0]*g,x=v[1]*g,b=v[2]*g,y=new n.Point(r[0],r[1]),T=new n.Point(r[2],r[3]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y); +w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(r[0]-w.x,r[1]-w.y),l.push(m,x,b,g),l.push(r[0]+w.x,r[1]+w.y),l.push(m,x,b,g);for(var _=1;c-1>_;_++){var y=new n.Point(r[2*(_-1)],r[2*(_-1)+1]),T=new n.Point(r[2*_],r[2*_+1]),R=new n.Point(r[2*(_+1)],r[2*(_+1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f;var S=new n.Point(-(T.y-R.y),T.x-R.x),C=Math.sqrt(S.x*S.x+S.y*S.y);S.x/=C,S.y/=C,S.x*=f,S.y*=f;var L=new n.Point(-w.x+T.x,-w.y+T.y),E=new n.Point(-w.x+y.x,-w.y+y.y),B=new n.Point(-S.x+T.x,-S.y+T.y),P=new n.Point(-S.x+R.x,-S.y+R.y),F=E.y-L.y,G=L.x-E.x,I=E.x*L.y-L.x*E.y,D=P.y-B.y,M=B.x-P.x,O=P.x*B.y-B.x*P.y,W=F*M-D*G;0==W&&(W+=1);var U=new n.Point;U.x=(G*O-M*I)/W,U.y=(D*I-F*O)/W;var j=(U.x-T.x)*(U.x-T.x)+(U.y-T.y)+(U.y-T.y);if(j>19600){var k=new n.Point(w.x-S.x,w.y-S.y),N=Math.sqrt(k.x*k.x+k.y*k.y);k.x/=N,k.y/=N,k.x*=f,k.y*=f,l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),l.push(T.x+k.x,T.y+k.y),l.push(m,x,b,g),l.push(T.x-k.x,T.y-k.y),l.push(m,x,b,g),d++}else l.push(U.x,U.y),l.push(m,x,b,g),l.push(T.x-(U.x-T.x),T.y-(U.y-T.y)),l.push(m,x,b,g)}var y=new n.Point(r[2*(c-2)],r[2*(c-2)+1]),T=new n.Point(r[2*(c-1)],r[2*(c-1)+1]),w=new n.Point(-(y.y-T.y),y.x-T.x),A=Math.sqrt(w.x*w.x+w.y*w.y);w.x/=A,w.y/=A,w.x*=f,w.y*=f,l.push(T.x-w.x,T.y-w.y),l.push(m,x,b,g),l.push(T.x+w.x,T.y+w.y),l.push(m,x,b,g),u.push(p);for(var _=0;d>_;_++)u.push(p++);u.push(p-1)}},n.WebGLGraphics.buildPoly=function(t,i){var r=t.points;if(!(6>r.length)){for(var s=i.points,a=i.indices,o=r.length/2,h=e(t.fillColor),l=t.fillAlpha,u=h[0]*l,c=h[1]*l,d=h[2]*l,p=n.PolyK.Triangulate(r),f=s.length/6,v=0;p.length>v;v+=3)a.push(p[v]+f),a.push(p[v]+f),a.push(p[v+1]+f),a.push(p[v+2]+f),a.push(p[v+2]+f);a.push(p[v+2]+f);for(var v=0;o>v;v++)s.push(r[2*v],r[2*v+1],u,c,d,l)}},n._defaultFrame=new n.Rectangle(0,0,1,1),n.gl,n.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{n.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!1})}catch(a){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}n.initPrimitiveShader(),n.initDefaultShader(),n.initDefaultStripShader(),n.activateDefaultShader();var o=this.gl;n.WebGLRenderer.gl=o,this.batch=new n.WebGLBatch(o),o.disable(o.DEPTH_TEST),o.disable(o.CULL_FACE),o.enable(o.BLEND),o.colorMask(!0,!0,!0,this.transparent),n.projection=new n.Point(400,300),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new n.WebGLRenderGroup(this.gl)},n.WebGLRenderer.constructor=n.WebGLRenderer,n.WebGLRenderer.getBatch=function(){return 0==n._batchs.length?new n.WebGLBatch(n.WebGLRenderer.gl):n._batchs.pop()},n.WebGLRenderer.returnBatch=function(t){t.clean(),n._batchs.push(t)},n.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage=t,this.stageRenderGroup.setRenderable(t)),n.WebGLRenderer.updateTextures(),t.updateTransform();var e=this.gl;if(e.colorMask(!0,!0,!0,this.transparent),e.viewport(0,0,this.width,this.height),e.bindFramebuffer(e.FRAMEBUFFER,null),e.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],!this.transparent),e.clear(e.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(n.projection),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),n.Texture.frameUpdates.length>0){for(var i=0;n.Texture.frameUpdates.length>i;i++)n.Texture.frameUpdates[i].updateFrame=!1;n.Texture.frameUpdates=[]}}},n.WebGLRenderer.updateTextures=function(){for(var t=0;n.texturesToUpdate.length>t;t++)this.updateTexture(n.texturesToUpdate[t]);for(var t=0;n.texturesToDestroy.length>t;t++)this.destroyTexture(n.texturesToDestroy[t]);n.texturesToUpdate=[],n.texturesToDestroy=[]},n.WebGLRenderer.updateTexture=function(t){var e=n.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))},n.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},n.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),n.projection.x=this.width/2,n.projection.y=this.height/2},n.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},n.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;n.TextureCache.length>t;t++)this.updateTexture(n.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;n._restoreBatchs(this.gl),this.contextLost=!1},n._batchs=[],n._getBatch=function(t){return 0==n._batchs.length?new n.WebGLBatch(t):n._batchs.pop()},n._returnBatch=function(t){t.clean(),n._batchs.push(t)},n._restoreBatchs=function(t){for(var e=0;n._batchs.length>e;e++)n._batchs[e].restoreLostContext(t)},n.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=n.blendModes.NORMAL,this.dynamicSize=1},n.WebGLBatch.constructor=n.WebGLBatch,n.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},n.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},n.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()},n.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},n.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},n.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)},n.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new n.WebGLBatch(this.gl);e.init(t),e.texture=this.texture,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},n.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},n.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,n=4*i;this.indices[r+0]=n+0,this.indices[r+1]=n+1,this.indices[r+2]=n+2,this.indices[r+3]=n+0,this.indices[r+4]=n+2,this.indices[r+5]=n+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},n.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizer;r++)i=this.batchs[r],i instanceof n.WebGLBatch?this.batchs[r].render():i instanceof n.TilingSprite?i.visible&&this.renderTilingSprite(i,t):i instanceof n.Strip?i.visible&&this.renderStrip(i,t):i instanceof n.Graphics&&i.visible&&n.WebGLGraphics.renderGraphics(i,t)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniform2f(n.shaderProgram.projectionVector,e.x,e.y);var r,s,a,o,h=t.renderable?t:this.getNextRenderable(t),l=h.batch;if(h instanceof n.Sprite){l=h.batch;var u=l.head;if(u==h)r=0;else for(r=1;u.__next!=h;)r++,u=u.__next}else l=h;for(var c,d=t,p=t;p.children.length>0;)p=p.children[p.children.length-1],p.renderable&&(d=p);if(d instanceof n.Sprite){c=d.batch;var u=c.head;if(u==d)a=0;else for(a=1;u.__next!=d;)a++,u=u.__next}else c=d;if(l==c)return l instanceof n.WebGLBatch?l.render(r,a+1):this.renderSpecial(l),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):this.renderSpecial(l);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():this.renderSpecial(renderable);c instanceof n.WebGLBatch?c.render(0,a+1):this.renderSpecial(c)},n.WebGLRenderGroup.prototype.renderSpecial=function(t){t instanceof n.TilingSprite?t.visible&&this.renderTilingSprite(t,projectionMatrix):t instanceof n.Strip?t.visible&&this.renderStrip(t,projectionMatrix):t instanceof n.CustomRenderable?t.visible&&t.renderWebGL(this,projectionMatrix):t instanceof n.Graphics&&t.visible&&n.WebGLGraphics.renderGraphics(t)},n.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var n=i[r];n.worldVisible=n.visible&&e,n.textureChange&&(n.textureChange=!1,n.worldVisible&&(this.removeDisplayObject(n),this.addDisplayObject(n))),n.children.length>0&&this.checkVisibility(n,n.worldVisible)}},n.WebGLRenderGroup.prototype.updateTexture=function(t){if(1==t.batch.length)return t.batch.texture=t.texture.baseTexture,void 0;if(t.batch.texture!=t.texture.baseTexture)if(t.batch.head==t){var e=t.batch,i=this.batchs.indexOf(e),r=this.batchs[i-1];if(e.remove(t),r)if(r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)r.insertAfter(t,r.tail);else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i-1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(0,0,s)}}else if(t.batch.tail==t){var e=t.batch,i=this.batchs.indexOf(e),a=this.batchs[i+1];if(e.remove(t),a){if(a.texture==t.texture.baseTexture&&a.blendMode==t.blendMode)return a.insertBefore(t,a.head),void 0;var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.splice(i+1,0,s)}else{var s=n.WebGLRenderer.getBatch();s.init(t),this.batchs.push(s)}}else{var e=t.batch,o=e.split(t);o.remove(t);var s=n.WebGLRenderer.getBatch(),i=this.batchs.indexOf(e);s.init(t),this.batchs.splice(i+1,0,s,o)}},n.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof n.Sprite){var r,s;if(e instanceof n.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 n.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 a=r.split(i),o=n.WebGLRenderer.getBatch(),h=this.batchs.indexOf(r);return o.init(t),this.batchs.splice(h+1,0,o,a),void 0}}}else s=i;var o=n.WebGLRenderer.getBatch();if(o.init(t),r){var h=this.batchs.indexOf(r);this.batchs.splice(h+1,0,o)}else this.batchs.push(o)}else t instanceof n.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof n.Strip?(this.initStrip(t),this.batchs.push(t)):t instanceof n.Graphics&&this.batchs.push(t);this.batchUpdate=!0}},n.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},n.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof n.WebGLBatch&&this.batchs[r+1]instanceof n.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 n.WebGLBatch&&n.WebGLRenderer.returnBatch(e),n.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof n.WebGLBatch&&n.WebGLRenderer.returnBatch(e)}}},n.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])}},n.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){if(!e.parent)return null;for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root||!e.parent){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},n.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex){if(e=e.parent,!e)return null}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},n.WebGLRenderGroup.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},n.WebGLRenderGroup.prototype.renderStrip=function(t,e){var i=this.gl,r=n.shaderProgram;i.useProgram(n.stripShaderProgram);var s=n.mat3.clone(t.worldTransform);n.mat3.transpose(s),i.uniformMatrix3fv(n.stripShaderProgram.translationMatrix,!1,s),i.uniform2f(n.stripShaderProgram.projectionVector,e.x,e.y),t.blendMode==n.blendModes.NORMAL?i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA):i.blendFunc(i.ONE,i.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferData(i.ARRAY_BUFFER,t.verticies,i.STATIC_DRAW),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferData(i.ARRAY_BUFFER,t.uvs,i.STATIC_DRAW),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.bufferData(i.ARRAY_BUFFER,t.colors,i.STATIC_DRAW),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t.indices,i.STATIC_DRAW)):(i.bindBuffer(i.ARRAY_BUFFER,t._vertexBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.verticies),i.vertexAttribPointer(r.vertexPositionAttribute,2,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.vertexAttribPointer(r.textureCoordAttribute,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.baseTexture._glTexture),i.bindBuffer(i.ARRAY_BUFFER,t._colorBuffer),i.vertexAttribPointer(r.colorAttribute,1,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),i.drawElements(i.TRIANGLE_STRIP,t.indices.length,i.UNSIGNED_SHORT,0),i.useProgram(n.shaderProgram)},n.WebGLRenderGroup.prototype.renderTilingSprite=function(t,e){var i=this.gl;n.shaderProgram;var r=t.tilePosition,s=t.tileScale,a=r.x/t.texture.baseTexture.width,o=r.y/t.texture.baseTexture.height,h=t.width/t.texture.baseTexture.width/s.x,l=t.height/t.texture.baseTexture.height/s.y;t.uvs[0]=0-a,t.uvs[1]=0-o,t.uvs[2]=1*h-a,t.uvs[3]=0-o,t.uvs[4]=1*h-a,t.uvs[5]=1*l-o,t.uvs[6]=0-a,t.uvs[7]=1*l-o,i.bindBuffer(i.ARRAY_BUFFER,t._uvBuffer),i.bufferSubData(i.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t,e)},n.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)},n.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")},n.CanvasRenderer.constructor=n.CanvasRenderer,n.CanvasRenderer.prototype.render=function(t){n.texturesToUpdate=[],n.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))),n.Texture.frameUpdates.length>0&&(n.Texture.frameUpdates=[])},n.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},n.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;if(t.visible){if(t instanceof n.Sprite){var r=t.texture.frame;r&&(i.globalAlpha=t.worldAlpha,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,r.x,r.y,r.width,r.height,t.anchor.x*-r.width,t.anchor.y*-r.height,r.width,r.height))}else t instanceof n.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof n.TilingSprite?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t)):t instanceof n.CustomRenderable?t.renderCanvas(this):t instanceof n.Graphics&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),n.CanvasGraphics.renderGraphics(t,i));if(t.children)for(var s=0;t.children.length>s;s++)this.renderDisplayObject(t.children[s]);this.context.setTransform(1,0,0,1,0,0)}},n.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 n=1;r-2>n;n++){var s=2*n,a=i[s],o=i[s+2],h=i[s+4],l=i[s+1],u=i[s+3],c=i[s+5];e.moveTo(a,l),e.lineTo(o,u),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},n.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()},n.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,n=i.length/2;this.count++;for(var s=1;n-2>s;s++){var a=2*s,o=i[a],h=i[a+2],l=i[a+4],u=i[a+1],c=i[a+3],d=i[a+5],p=r[a]*t.texture.width,f=r[a+2]*t.texture.width,v=r[a+4]*t.texture.width,g=r[a+1]*t.texture.height,m=r[a+3]*t.texture.height,x=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,c),e.lineTo(l,d),e.closePath(),e.clip();var b=p*m+g*v+f*x-m*v-g*f-p*x,y=o*m+g*l+h*x-m*l-g*h-o*x,T=p*h+o*v+f*l-h*v-o*f-p*l,w=p*m*l+g*h*v+o*f*x-o*m*v-g*f*l-p*h*x,A=u*m+g*d+c*x-m*d-g*c-u*x,_=p*c+u*v+f*d-c*v-u*f-p*d,R=p*m*d+g*c*v+u*f*x-u*m*v-g*f*d-p*c*x;e.transform(y/b,A/b,T/b,_/b,w/b,R/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},n.CanvasGraphics=function(){},n.CanvasGraphics.renderGraphics=function(t,e){for(var i=0;t.graphicsData.length>i;i++){var r=t.graphicsData[i],s=r.points;if(e.strokeStyle=color="#"+("00000"+(0|r.lineColor).toString(16)).substr(-6),e.lineWidth=r.lineWidth,r.type==n.Graphics.POLY){e.beginPath(),e.moveTo(s[0],s[1]);for(var a=1;s.length/2>a;a++)e.lineTo(s[2*a],s[2*a+1]);s[0]==s[s.length-2]&&s[1]==s[s.length-1]&&e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}else if(r.type==n.Graphics.RECT)r.fillColor&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fillRect(s[0],s[1],s[2],s[3])),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.strokeRect(s[0],s[1],s[2],s[3]));else if(r.type==n.Graphics.CIRC)e.beginPath(),e.arc(s[0],s[1],s[2],0,2*Math.PI),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke());else if(r.type==n.Graphics.ELIP){var o=r.points,h=2*o[2],l=2*o[3],u=o[0]-h/2,c=o[1]-l/2;e.beginPath();var d=.5522848,p=h/2*d,f=l/2*d,v=u+h,g=c+l,m=u+h/2,x=c+l/2;e.moveTo(u,x),e.bezierCurveTo(u,x-f,m-p,c,m,c),e.bezierCurveTo(m+p,c,v,x-f,v,x),e.bezierCurveTo(v,x+f,m+p,g,m,g),e.bezierCurveTo(m-p,g,u,x+f,u,x),e.closePath(),r.fill&&(e.globalAlpha=r.fillAlpha,e.fillStyle=color="#"+("00000"+(0|r.fillColor).toString(16)).substr(-6),e.fill()),r.lineWidth&&(e.globalAlpha=r.lineAlpha,e.stroke())}}},n.Graphics=function(){n.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=2,this.lineColor="#FF0000",this.graphicsData=[],this.currentPath={points:[]}},n.Graphics.constructor=n.Graphics,n.Graphics.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Graphics.prototype.lineStyle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.lineWidth=t||0,this.lineColor=e||0,this.lineAlpha=void 0==i?1:i,this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.graphicsData.push(this.currentPath)},n.Graphics.prototype.moveTo=function(t,e){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:n.Graphics.POLY},this.currentPath.points.push(t,e),this.graphicsData.push(this.currentPath)},n.Graphics.prototype.lineTo=function(t,e){this.currentPath.points.push(t,e),this.dirty=!0},n.Graphics.prototype.beginFill=function(t,e){this.filling=!0,this.fillColor=t||0,this.fillAlpha=e||1},n.Graphics.prototype.endFill=function(){this.filling=!1,this.fillColor=null,this.fillAlpha=1},n.Graphics.prototype.drawRect=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.RECT},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawCircle=function(t,e,i){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,i],type:n.Graphics.CIRC},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.drawElipse=function(t,e,i,r){0==this.currentPath.points.length&&this.graphicsData.pop(),this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[t,e,i,r],type:n.Graphics.ELIP},this.graphicsData.push(this.currentPath),this.dirty=!0},n.Graphics.prototype.clear=function(){this.dirty=!0,this.clearDirty=!0,this.graphicsData=[]},n.Graphics.POLY=0,n.Graphics.RECT=1,n.Graphics.CIRC=2,n.Graphics.ELIP=3,n.Strip=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=n.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},n.Strip.constructor=n.Strip,n.Strip.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},n.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Rope=function(t,e){n.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()},n.Rope.constructor=n.Rope,n.Rope.prototype=Object.create(n.Strip.prototype),n.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,n=t[0],s=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 s=t[o],h=4*o,l=o/(a-1);o%2?(e[h]=l,e[h+1]=0,e[h+2]=l,e[h+3]=1):(e[h]=l,e[h+1]=0,e[h+2]=l,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,n=s}}},n.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},a=t[0];this.count-=.2,i[0]=a.x+s.x,i[1]=a.y+s.y,i[2]=a.x-s.x,i[3]=a.y-s.y;for(var o=t.length,h=1;o>h;h++){var a=t[h],l=4*h;e=t.length-1>h?t[h+1]:a,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-h/(o-1));u>1&&(u=1);var c=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=c,s.y/=c,s.x*=d,s.y*=d,i[l]=a.x+s.x,i[l+1]=a.y+s.y,i[l+2]=a.x-s.x,i[l+3]=a.y-s.y,r=a}n.DisplayObjectContainer.prototype.updateTransform.call(this)}},n.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite=function(t,e,i){n.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new n.Point(1,1),this.tilePosition=new n.Point(0,0),this.blendMode=n.blendModes.NORMAL +},n.TilingSprite.constructor=n.TilingSprite,n.TilingSprite.prototype=Object.create(n.DisplayObjectContainer.prototype),n.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},n.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},n.Spine=function(t){if(n.DisplayObjectContainer.call(this),this.spineData=n.AnimCache[t],!this.spineData)throw Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+t);this.count=0,this.sprites=[],this.skeleton=new u.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new u.AnimationStateData(this.spineData),this.state=new u.AnimationState(this.stateData);for(var e=0;this.skeleton.drawOrder.length>e;e++){var i=this.skeleton.drawOrder[e].data.attachmentName;n.TextureCache[i]||(i+=".png");var r=new n.Sprite(n.Texture.fromFrame(i));r.anchor.x=r.anchor.y=.5,this.addChild(r),this.sprites.push(r)}},n.Spine.constructor=n.Spine,n.Spine.prototype=Object.create(n.DisplayObjectContainer.prototype),n.Spine.prototype.updateTransform=function(){this.state.update(1/60),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var t=0;this.skeleton.drawOrder.length>t;t++){var e=this.skeleton.drawOrder[t],i=e.bone.worldX+e.attachment.x*e.bone.m00+e.attachment.y*e.bone.m01+.5*e.attachment.width,r=e.bone.worldY+e.attachment.x*e.bone.m10+e.attachment.y*e.bone.m11+.5*e.attachment.height;if(e.cacheName!=e.attachment.name){var s=e.attachment.name;n.TextureCache[s]||(s+=".png"),this.sprites[t].setTexture(n.TextureCache[s]),e.cacheName=e.attachment.name}i+=-(e.attachment.width*(e.bone.worldScaleX+e.attachment.scaleX-1)>>1),r+=-(e.attachment.height*(e.bone.worldScaleY+e.attachment.scaleY-1)>>1),this.sprites[t].position.x=i,this.sprites[t].position.y=r,this.sprites[t].rotation=-(e.bone.worldRotation+e.attachment.rotation)*(Math.PI/180)}n.DisplayObjectContainer.prototype.updateTransform.call(this)};var u={};u.BoneData=function(t,e){this.name=t,this.parent=e},u.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1},u.SlotData=function(t,e){this.name=t,this.boneData=e},u.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null},u.Bone=function(t,e){this.data=t,this.parent=e,this.setToSetupPose()},u.Bone.yDown=!1,u.Bone.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,updateWorldTransform:function(t,e){var i=this.parent;null!=i?(this.worldX=this.x*i.m00+this.y*i.m01+i.worldX,this.worldY=this.x*i.m10+this.y*i.m11+i.worldY,this.worldScaleX=i.worldScaleX*this.scaleX,this.worldScaleY=i.worldScaleY*this.scaleY,this.worldRotation=i.worldRotation+this.rotation):(this.worldX=this.x,this.worldY=this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotation);var r=this.worldRotation*Math.PI/180,n=Math.cos(r),s=Math.sin(r);this.m00=n*this.worldScaleX,this.m10=s*this.worldScaleX,this.m01=-s*this.worldScaleY,this.m11=n*this.worldScaleY,t&&(this.m00=-this.m00,this.m01=-this.m01),e&&(this.m10=-this.m10,this.m11=-this.m11),u.Bone.yDown&&(this.m10=-this.m10,this.m11=-this.m11)},setToSetupPose:function(){var t=this.data;this.x=t.x,this.y=t.y,this.rotation=t.rotation,this.scaleX=t.scaleX,this.scaleY=t.scaleY}},u.Slot=function(t,e,i){this.data=t,this.skeleton=e,this.bone=i,this.setToSetupPose()},u.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,setAttachment:function(t){this.attachment=t,this._attachmentTime=this.skeleton.time},setAttachmentTime:function(t){this._attachmentTime=this.skeleton.time-t},getAttachmentTime:function(){return this.skeleton.time-this._attachmentTime},setToSetupPose:function(){var t=this.data;this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a;for(var e=this.skeleton.data.slots,i=0,r=e.length;r>i;i++)if(e[i]==t){this.setAttachment(t.attachmentName?this.skeleton.getAttachmentBySlotIndex(i,t.attachmentName):null);break}}},u.Skin=function(t){this.name=t,this.attachments={}},u.Skin.prototype={addAttachment:function(t,e,i){this.attachments[t+":"+e]=i},getAttachment:function(t,e){return this.attachments[t+":"+e]},_attachAll:function(t,e){for(var i in e.attachments){var r=i.indexOf(":"),n=parseInt(i.substring(0,r)),s=i.substring(r+1),a=t.slots[n];if(a.attachment&&a.attachment.name==s){var o=this.getAttachment(n,s);o&&a.setAttachment(o)}}}},u.Animation=function(t,e,i){this.name=t,this.timelines=e,this.duration=i},u.Animation.prototype={apply:function(t,e,i){i&&0!=this.duration&&(e%=this.duration);for(var r=this.timelines,n=0,s=r.length;s>n;n++)r[n].apply(t,e,1)},mix:function(t,e,i,r){i&&0!=this.duration&&(e%=this.duration);for(var n=this.timelines,s=0,a=n.length;a>s;s++)n[s].apply(t,e,r)}},u.binarySearch=function(t,e,i){var r=0,n=Math.floor(t.length/i)-2;if(0==n)return i;for(var s=n>>>1;;){if(e>=t[(s+1)*i]?r=s+1:n=s,r==n)return(r+1)*i;s=r+n>>>1}},u.linearSearch=function(t,e,i){for(var r=0,n=t.length-i;n>=r;r+=i)if(t[r]>e)return r;return-1},u.Curves=function(t){this.curves=[],this.curves.length=6*(t-1)},u.Curves.prototype={setLinear:function(t){this.curves[6*t]=0},setStepped:function(t){this.curves[6*t]=-1},setCurve:function(t,e,i,r,n){var s=.1,a=s*s,o=a*s,h=3*s,l=3*a,u=6*a,c=6*o,d=2*-e+r,p=2*-i+n,f=3*(e-r)+1,v=3*(i-n)+1,g=6*t,m=this.curves;m[g]=e*h+d*l+f*o,m[g+1]=i*h+p*l+v*o,m[g+2]=d*u+f*c,m[g+3]=p*u+v*c,m[g+4]=f*c,m[g+5]=v*c},getCurvePercent:function(t,e){e=0>e?0:e>1?1:e;var i=6*t,r=this.curves,n=r[i];if(!n)return e;if(-1==n)return 0;for(var s=r[i+1],a=r[i+2],o=r[i+3],h=r[i+4],l=r[i+5],u=n,c=s,d=8;;){if(u>=e){var p=u-n,f=c-s;return f+(c-f)*(e-p)/(u-p)}if(0==d)break;d--,n+=a,s+=o,a+=h,o+=l,u+=n,c+=s}return c+(1-c)*(e-u)/(1-u)}},u.RotateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=2*t},u.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){t*=2,this.frames[t]=e,this.frames[t+1]=i},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-2]){for(var s=n.data.rotation+r[r.length-1]-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;return n.rotation+=s*i,void 0}var a=u.binarySearch(r,e,2),o=r[a-1],h=r[a],l=1-(e-h)/(r[a-2]-h);l=this.curves.getCurvePercent(a/2-1,l);for(var s=r[a+1]-o;s>180;)s-=360;for(;-180>s;)s+=360;for(s=n.data.rotation+(o+s*l)-n.rotation;s>180;)s-=360;for(;-180>s;)s+=360;n.rotation+=s*i}}},u.TranslateTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.x+=(n.data.x+r[r.length-2]-n.x)*i,n.y+=(n.data.y+r[r.length-1]-n.y)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.x+=(n.data.x+a+(r[s+1]-a)*l-n.x)*i,n.y+=(n.data.y+o+(r[s+2]-o)*l-n.y)*i}}},u.ScaleTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=3*t},u.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(t,e,i,r){t*=3,this.frames[t]=e,this.frames[t+1]=i,this.frames[t+2]=r},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.bones[this.boneIndex];if(e>=r[r.length-3])return n.scaleX+=(n.data.scaleX-1+r[r.length-2]-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+r[r.length-1]-n.scaleY)*i,void 0;var s=u.binarySearch(r,e,3),a=r[s-2],o=r[s-1],h=r[s],l=1-(e-h)/(r[s+-3]-h);l=this.curves.getCurvePercent(s/3-1,l),n.scaleX+=(n.data.scaleX-1+a+(r[s+1]-a)*l-n.scaleX)*i,n.scaleY+=(n.data.scaleY-1+o+(r[s+2]-o)*l-n.scaleY)*i}}},u.ColorTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=5*t},u.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e){t*=5,this.frames[t]=e,this.frames[t+1]=r,this.frames[t+2]=g,this.frames[t+3]=b,this.frames[t+4]=a},apply:function(t,e,i){var r=this.frames;if(!(r[0]>e)){var n=t.slots[this.slotIndex];if(e>=r[r.length-5]){var s=r.length-1;return n.r=r[s-3],n.g=r[s-2],n.b=r[s-1],n.a=r[s],void 0}var a=u.binarySearch(r,e,5),o=r[a-4],h=r[a-3],l=r[a-2],c=r[a-1],d=r[a],p=1-(e-d)/(r[a-5]-d);p=this.curves.getCurvePercent(a/5-1,p);var f=o+(r[a+1]-o)*p,v=h+(r[a+2]-h)*p,g=l+(r[a+3]-l)*p,m=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(v-n.g)*i,n.b+=(g-n.b)*i,n.a+=(m-n.a)*i):(n.r=f,n.g=v,n.b=g,n.a=m)}}},u.AttachmentTimeline=function(t){this.curves=new u.Curves(t),this.frames=[],this.frames.length=t,this.attachmentNames=[],this.attachmentNames.length=t},u.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(t,e,i){this.frames[t]=e,this.attachmentNames[t]=i},apply:function(t,e){var i=this.frames;if(!(i[0]>e)){var r;r=e>=i[i.length-1]?i.length-1:u.binarySearch(i,e,1)-1;var n=this.attachmentNames[r];t.slots[this.slotIndex].setAttachment(n?t.getAttachmentBySlotIndex(this.slotIndex,n):null)}}},u.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.animations=[]},u.SkeletonData.prototype={defaultSkin:null,findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return slot[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].name==t)return i;return-1},findSkin:function(t){for(var e=this.skins,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},findAnimation:function(t){for(var e=this.animations,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null}},u.Skeleton=function(t){this.data=t,this.bones=[];for(var e=0,i=t.bones.length;i>e;e++){var r=t.bones[e],n=r.parent?this.bones[t.bones.indexOf(r.parent)]:null;this.bones.push(new u.Bone(r,n))}this.slots=[],this.drawOrder=[];for(var e=0,i=t.slots.length;i>e;e++){var s=t.slots[e],a=this.bones[t.bones.indexOf(s.boneData)],o=new u.Slot(s,this,a);this.slots.push(o),this.drawOrder.push(o)}},u.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateWorldTransform:function(){for(var t=this.flipX,e=this.flipY,i=this.bones,r=0,n=i.length;n>r;r++)i[r].updateWorldTransform(t,e)},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var t=this.bones,e=0,i=t.length;i>e;e++)t[e].setToSetupPose()},setSlotsToSetupPose:function(){for(var t=this.slots,e=0,i=t.length;i>e;e++)t[e].setToSetupPose(e)},getRootBone:function(){return 0==this.bones.length?null:this.bones[0]},findBone:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findBoneIndex:function(t){for(var e=this.bones,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},findSlot:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return e[i];return null},findSlotIndex:function(t){for(var e=this.slots,i=0,r=e.length;r>i;i++)if(e[i].data.name==t)return i;return-1},setSkinByName:function(t){var e=this.data.findSkin(t);if(!e)throw"Skin not found: "+t;this.setSkin(e)},setSkin:function(t){this.skin&&t&&t._attachAll(this,this.skin),this.skin=t},getAttachmentBySlotName:function(t,e){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(t),e)},getAttachmentBySlotIndex:function(t,e){if(this.skin){var i=this.skin.getAttachment(t,e);if(i)return i}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(t,e):null},setAttachment:function(t,e){for(var i=this.slots,r=0,n=i.size;n>r;r++){var s=i[r];if(s.data.name==t){var a=null;if(e&&(a=this.getAttachment(r,e),null==a))throw"Attachment not found: "+e+", for slot: "+t;return s.setAttachment(a),void 0}}throw"Slot not found: "+t},update:function(t){time+=t}},u.AttachmentType={region:0},u.RegionAttachment=function(){this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},u.RegionAttachment.prototype={x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(t,e,i,r,n){var s=this.uvs;n?(s[2]=t,s[3]=r,s[4]=t,s[5]=e,s[6]=i,s[7]=e,s[0]=i,s[1]=r):(s[0]=t,s[1]=r,s[2]=t,s[3]=e,s[4]=i,s[5]=e,s[6]=i,s[7]=r)},updateOffset:function(){var t=this.width/this.regionOriginalWidth*this.scaleX,e=this.height/this.regionOriginalHeight*this.scaleY,i=-this.width/2*this.scaleX+this.regionOffsetX*t,r=-this.height/2*this.scaleY+this.regionOffsetY*e,n=i+this.regionWidth*t,s=r+this.regionHeight*e,a=this.rotation*Math.PI/180,o=Math.cos(a),h=Math.sin(a),l=i*o+this.x,u=i*h,c=r*o+this.y,d=r*h,p=n*o+this.x,f=n*h,v=s*o+this.y,g=s*h,m=this.offset;m[0]=l-d,m[1]=c+u,m[2]=l-g,m[3]=v+u,m[4]=p-g,m[5]=v+f,m[6]=p-d,m[7]=c+f},computeVertices:function(t,e,i,r){t+=i.worldX,e+=i.worldY;var n=i.m00,s=i.m01,a=i.m10,o=i.m11,h=this.offset;r[0]=h[0]*n+h[1]*s+t,r[1]=h[0]*a+h[1]*o+e,r[2]=h[2]*n+h[3]*s+t,r[3]=h[2]*a+h[3]*o+e,r[4]=h[4]*n+h[5]*s+t,r[5]=h[4]*a+h[5]*o+e,r[6]=h[6]*n+h[7]*s+t,r[7]=h[6]*a+h[7]*o+e}},u.AnimationStateData=function(t){this.skeletonData=t,this.animationToMixTime={}},u.AnimationStateData.prototype={setMixByName:function(t,e,i){var r=this.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;var n=this.skeletonData.findAnimation(e);if(!n)throw"Animation not found: "+e;this.setMix(r,n,i)},setMix:function(t,e,i){this.animationToMixTime[t.name+":"+e.name]=i},getMix:function(t,e){var i=this.animationToMixTime[t.name+":"+e.name];return i?i:0}},u.AnimationState=function(t){this.data=t,this.queue=[]},u.AnimationState.prototype={current:null,previous:null,currentTime:0,previousTime:0,currentLoop:!1,previousLoop:!1,mixTime:0,mixDuration:0,update:function(t){if(this.currentTime+=t,this.previousTime+=t,this.mixTime+=t,this.queue.length>0){var e=this.queue[0];this.currentTime>=e.delay&&(this._setAnimation(e.animation,e.loop),this.queue.shift())}},apply:function(t){if(this.current)if(this.previous){this.previous.apply(t,this.previousTime,this.previousLoop);var e=this.mixTime/this.mixDuration;e>=1&&(e=1,this.previous=null),this.current.mix(t,this.currentTime,this.currentLoop,e)}else this.current.apply(t,this.currentTime,this.currentLoop)},clearAnimation:function(){this.previous=null,this.current=null,this.queue.length=0},_setAnimation:function(t,e){this.previous=null,t&&this.current&&(this.mixDuration=this.data.getMix(this.current,t),this.mixDuration>0&&(this.mixTime=0,this.previous=this.current,this.previousTime=this.currentTime,this.previousLoop=this.currentLoop)),this.current=t,this.currentLoop=e,this.currentTime=0},setAnimationByName:function(t,e){var i=this.data.skeletonData.findAnimation(t);if(!i)throw"Animation not found: "+t;this.setAnimation(i,e)},setAnimation:function(t,e){this.queue.length=0,this._setAnimation(t,e)},addAnimationByName:function(t,e,i){var r=this.data.skeletonData.findAnimation(t);if(!r)throw"Animation not found: "+t;this.addAnimation(r,e,i)},addAnimation:function(t,e,i){var r={};if(r.animation=t,r.loop=e,!i||0>=i){var n=0==this.queue.length?this.current:this.queue[this.queue.length-1].animation;i=null!=n?n.duration-this.data.getMix(n,t)+(i||0):0}r.delay=i,this.queue.push(r)},isComplete:function(){return!this.current||this.currentTime>=this.current.duration}},u.SkeletonJson=function(t){this.attachmentLoader=t},u.SkeletonJson.prototype={scale:1,readSkeletonData:function(t){for(var e=new u.SkeletonData,i=t.bones,r=0,n=i.length;n>r;r++){var s=i[r],a=null;if(s.parent&&(a=e.findBone(s.parent),!a))throw"Parent bone not found: "+s.parent;var o=new u.BoneData(s.name,a);o.length=(s.length||0)*this.scale,o.x=(s.x||0)*this.scale,o.y=(s.y||0)*this.scale,o.rotation=s.rotation||0,o.scaleX=s.scaleX||1,o.scaleY=s.scaleY||1,e.bones.push(o)}for(var h=t.slots,r=0,n=h.length;n>r;r++){var l=h[r],o=e.findBone(l.bone);if(!o)throw"Slot bone not found: "+l.bone;var c=new u.SlotData(l.name,o),d=l.color;d&&(c.r=u.SkeletonJson.toColor(d,0),c.g=u.SkeletonJson.toColor(d,1),c.b=u.SkeletonJson.toColor(d,2),c.a=u.SkeletonJson.toColor(d,3)),c.attachmentName=l.attachment,e.slots.push(c)}var p=t.skins;for(var f in p)if(p.hasOwnProperty(f)){var v=p[f],g=new u.Skin(f);for(var m in v)if(v.hasOwnProperty(m)){var x=e.findSlotIndex(m),b=v[m];for(var y in b)if(b.hasOwnProperty(y)){var T=this.readAttachment(g,y,b[y]);null!=T&&g.addAttachment(x,y,T)}}e.skins.push(g),"default"==g.name&&(e.defaultSkin=g)}var w=t.animations;for(var A in w)w.hasOwnProperty(A)&&this.readAnimation(A,w[A],e);return e},readAttachment:function(t,e,i){e=i.name||e;var r=u.AttachmentType[i.type||"region"],n=new u.RegionAttachment;return n.name=e,r==u.AttachmentType.region&&(n.x=(i.x||0)*this.scale,n.y=(i.y||0)*this.scale,n.scaleX=i.scaleX||1,n.scaleY=i.scaleY||1,n.rotation=i.rotation||0,n.width=(i.width||32)*this.scale,n.height=(i.height||32)*this.scale,n.updateOffset()),n},readAnimation:function(t,e,i){var r=[],n=0,s=e.bones;for(var a in s)if(s.hasOwnProperty(a)){var o=i.findBoneIndex(a);if(-1==o)throw"Bone not found: "+a;var h=s[a];for(var l in h)if(h.hasOwnProperty(l)){var c=h[l];if("rotate"==l){var d=new u.RotateTimeline(c.length);d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p,g.time,g.angle),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[2*d.getFrameCount()-2])}else{if("translate"!=l&&"scale"!=l)throw"Invalid timeline type for a bone: "+l+" ("+a+")";var d,m=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),m=this.scale),d.boneIndex=o;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],x=(g.x||0)*m,b=(g.y||0)*m;d.setFrame(p,g.time,x,b),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var y=e.slots;for(var T in y)if(y.hasOwnProperty(T)){var w=y[T],A=i.findSlotIndex(T);for(var l in w)if(w.hasOwnProperty(l)){var c=w[l];if("color"==l){var d=new u.ColorTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f],_=g.color,R=u.SkeletonJson.toColor(_,0),S=u.SkeletonJson.toColor(_,1),C=u.SkeletonJson.toColor(_,2),L=u.SkeletonJson.toColor(_,3);d.setFrame(p,g.time,R,S,C,L),u.SkeletonJson.readCurve(d,p,g),p++}r.push(d),n=Math.max(n,d.frames[5*d.getFrameCount()-5])}else{if("attachment"!=l)throw"Invalid timeline type for a slot: "+l+" ("+T+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=A;for(var p=0,f=0,v=c.length;v>f;f++){var g=c[f];d.setFrame(p++,g.time,g.name)}r.push(d),n=Math.max(n,d.frames[Math.floor(d.getFrameCount())-1])}}}i.animations.push(new u.Animation(t,r,n))}},u.SkeletonJson.readCurve=function(t,e,i){var r=i.curve;r&&("stepped"==r?t.curves.setStepped(e):r instanceof Array&&t.curves.setCurve(e,r[0],r[1],r[2],r[3]))},u.SkeletonJson.toColor=function(t,e){if(8!=t.length)throw"Color hexidecimal length must be 8, recieved: "+t;return parseInt(t.substring(2*e,2),16)/255},u.Atlas=function(t,e){this.textureLoader=e,this.pages=[],this.regions=[];var i=new u.AtlasReader(t),r=[];r.length=4;for(var n=null;;){var s=i.readLine();if(null==s)break;if(s=i.trim(s),0==s.length)n=null;else if(n){var a=new u.AtlasRegion;a.name=s,a.page=n,a.rotate="true"==i.readValue(),i.readTuple(r);var o=parseInt(r[0]),h=parseInt(r[1]);i.readTuple(r);var l=parseInt(r[0]),c=parseInt(r[1]);a.u=o/n.width,a.v=h/n.height,a.rotate?(a.u2=(o+c)/n.width,a.v2=(h+l)/n.height):(a.u2=(o+l)/n.width,a.v2=(h+c)/n.height),a.x=o,a.y=h,a.width=Math.abs(l),a.height=Math.abs(c),4==i.readTuple(r)&&(a.splits=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],4==i.readTuple(r)&&(a.pads=[parseInt(r[0]),parseInt(r[1]),parseInt(r[2]),parseInt(r[3])],i.readTuple(r))),a.originalWidth=parseInt(r[0]),a.originalHeight=parseInt(r[1]),i.readTuple(r),a.offsetX=parseInt(r[0]),a.offsetY=parseInt(r[1]),a.index=parseInt(i.readValue()),this.regions.push(a)}else{n=new u.AtlasPage,n.name=s,n.format=u.Atlas.Format[i.readValue()],i.readTuple(r),n.minFilter=u.Atlas.TextureFilter[r[0]],n.magFilter=u.Atlas.TextureFilter[r[1]];var d=i.readValue();n.uWrap=u.Atlas.TextureWrap.clampToEdge,n.vWrap=u.Atlas.TextureWrap.clampToEdge,"x"==d?n.uWrap=u.Atlas.TextureWrap.repeat:"y"==d?n.vWrap=u.Atlas.TextureWrap.repeat:"xy"==d&&(n.uWrap=n.vWrap=u.Atlas.TextureWrap.repeat),e.load(n,s),this.pages.push(n)}}},u.Atlas.prototype={findRegion:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++)if(e[i].name==t)return e[i];return null},dispose:function(){for(var t=this.pages,e=0,i=t.length;i>e;e++)this.textureLoader.unload(t[e].rendererObject)},updateUVs:function(t){for(var e=this.regions,i=0,r=e.length;r>i;i++){var n=e[i];n.page==t&&(n.u=n.x/t.width,n.v=n.y/t.height,n.rotate?(n.u2=(n.x+n.height)/t.width,n.v2=(n.y+n.width)/t.height):(n.u2=(n.x+n.width)/t.width,n.v2=(n.y+n.height)/t.height))}}},u.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},u.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},u.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},u.AtlasPage=function(){},u.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},u.AtlasRegion=function(){},u.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},u.AtlasReader=function(t){this.lines=t.split(/\r\n|\r|\n/)},u.AtlasReader.prototype={index:0,trim:function(t){return t.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var t=this.readLine(),e=t.indexOf(":");if(-1==e)throw"Invalid line: "+t;return this.trim(t.substring(e+1))},readTuple:function(t){var e=this.readLine(),i=e.indexOf(":");if(-1==i)throw"Invalid line: "+e;for(var r=0,n=i+1;3>r;r++){var s=e.indexOf(",",n);if(-1==s){if(0==r)throw"Invalid line: "+e;break}t[r]=this.trim(e.substr(n,s-n)),n=s+1}return t[r]=this.trim(e.substring(n)),r+1}},u.AtlasAttachmentLoader=function(t){this.atlas=t},u.AtlasAttachmentLoader.prototype={newAttachment:function(t,e,i){switch(e){case u.AttachmentType.region:var r=this.atlas.findRegion(i);if(!r)throw"Region not found in atlas: "+i+" ("+e+")";var n=new u.RegionAttachment(i);return n.rendererObject=r,n.setUVs(r.u,r.v,r.u2,r.v2,r.rotate),n.regionOffsetX=r.offsetX,n.regionOffsetY=r.offsetY,n.regionWidth=r.width,n.regionHeight=r.height,n.regionOriginalWidth=r.originalWidth,n.regionOriginalHeight=r.originalHeight,n}throw"Unknown attachment type: "+e}},n.AnimCache={},u.Bone.yDown=!0,n.CustomRenderable=function(){n.DisplayObject.call(this)},n.CustomRenderable.constructor=n.CustomRenderable,n.CustomRenderable.prototype=Object.create(n.DisplayObject.prototype),n.CustomRenderable.prototype.renderCanvas=function(){},n.CustomRenderable.prototype.initWebGL=function(){},n.CustomRenderable.prototype.renderWebGL=function(){},n.BaseTextureCache={},n.texturesToUpdate=[],n.texturesToDestroy=[],n.BaseTexture=function(t){if(n.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,n.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,n.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,n.texturesToUpdate.push(this);this._powerOf2=!1}},n.BaseTexture.constructor=n.BaseTexture,n.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,n.texturesToDestroy.push(this)},n.BaseTexture.fromImage=function(t,e){var i=n.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new n.BaseTexture(r),n.BaseTextureCache[t]=i}return i},n.TextureCache={},n.FrameCache={},n.Texture=function(t,e){if(n.EventTarget.call(this),e||(this.noFrame=!0,e=new n.Rectangle(0,0,1,1)),this.trim=new n.Point,t instanceof n.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new n.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},n.Texture.constructor=n.Texture,n.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new n.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})},n.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},n.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,n.Texture.frameUpdates.push(this)},n.Texture.fromImage=function(t,e){var i=n.TextureCache[t];return i||(i=new n.Texture(n.BaseTexture.fromImage(t,e)),n.TextureCache[t]=i),i},n.Texture.fromFrame=function(t){var e=n.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},n.Texture.fromCanvas=function(t){var e=new n.BaseTexture(t);return new n.Texture(e)},n.Texture.addTextureToCache=function(t,e){n.TextureCache[e]=t},n.Texture.removeTextureFromCache=function(t){var e=n.TextureCache[t];return n.TextureCache[t]=null,e},n.Texture.frameUpdates=[],n.RenderTexture=function(t,e){n.EventTarget.call(this),this.width=t||100,this.height=e||100,this.indetityMatrix=n.mat3.create(),this.frame=new n.Rectangle(0,0,this.width,this.height),n.gl?this.initWebGL():this.initCanvas()},n.RenderTexture.constructor=n.RenderTexture,n.RenderTexture.prototype=Object.create(n.Texture.prototype),n.RenderTexture.prototype.initWebGL=function(){var t=n.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new n.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.projection=new n.Point(this.width/2,this.height/2),this.projectionMatrix=n.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},n.RenderTexture.prototype.initCanvas=function(){this.renderer=new n.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new n.BaseTexture(this.renderer.view),this.frame=new n.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},n.RenderTexture.prototype.renderWebGL=function(t,e){var i=n.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));var r=t.children;t.worldTransform=n.mat3.create(),t.worldTransform[4]=-1,t.worldTransform[5]=2*this.projection.y;for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projection):o.renderSpecific(t,this.projection):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projection))},n.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=n.mat3.create();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),n.texturesToUpdate.push(this.baseTexture)},n.AssetLoader=function(t){n.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:n.ImageLoader,jpeg:n.ImageLoader,png:n.ImageLoader,gif:n.ImageLoader,json:n.JsonLoader,anim:n.SpineLoader,xml:n.BitmapFontLoader,fnt:n.BitmapFontLoader}},n.AssetLoader.constructor=n.AssetLoader,n.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(),n=this.loadersByType[r];if(!n)throw Error(r+" is an unsupported file type");var s=new n(i,this.crossorigin);s.addEventListener("loaded",function(){t.onAssetLoaded()}),s.load()}},n.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())},n.JsonLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.crossorigin=e,this.loaded=!1},n.JsonLoader.constructor=n.JsonLoader,n.JsonLoader.prototype.load=function(){this.ajaxRequest=new l;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)},n.JsonLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState)if(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()}else if(this.json.bones){var o=new u.SkeletonJson,h=o.readSkeletonData(this.json);n.AnimCache[this.url]=h,this.onLoaded()}else this.onLoaded();else this.onError()},n.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},n.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},n.SpriteSheetLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},n.SpriteSheetLoader.constructor=n.SpriteSheetLoader,n.SpriteSheetLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpriteSheetLoader.prototype.onJSONLoaded=function(){var t=this,e=this.baseUrl+this.json.meta.image,i=new n.ImageLoader(e,this.crossorigin),r=this.json.frames;this.texture=i.texture.baseTexture,i.addEventListener("loaded",function(){t.onLoaded()});for(var s in r){var a=r[s].frame;a&&(n.TextureCache[s]=new n.Texture(this.texture,{x:a.x,y:a.y,width:a.w,height:a.h}),r[s].trimmed&&(n.TextureCache[s].realSize=r[s].spriteSourceSize,n.TextureCache[s].trim.x=0))}i.load()},n.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this}) +},n.ImageLoader=function(t,e){n.EventTarget.call(this),this.texture=n.Texture.fromImage(t,e)},n.ImageLoader.constructor=n.ImageLoader,n.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},n.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.BitmapFontLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},n.BitmapFontLoader.constructor=n.BitmapFontLoader,n.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)},n.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 n.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 a=this.ajaxRequest.responseXML.getElementsByTagName("char"),o=0;a.length>o;o++){var h=parseInt(a[o].attributes.getNamedItem("id").nodeValue,10),l={x:parseInt(a[o].attributes.getNamedItem("x").nodeValue,10),y:parseInt(a[o].attributes.getNamedItem("y").nodeValue,10),width:parseInt(a[o].attributes.getNamedItem("width").nodeValue,10),height:parseInt(a[o].attributes.getNamedItem("height").nodeValue,10)};n.TextureCache[h]=new n.Texture(this.texture,l),i.chars[h]={xOffset:parseInt(a[o].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(a[o].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(a[o].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{},texture:new n.Texture(this.texture,l)}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(o=0;u.length>o;o++){var c=parseInt(u[o].attributes.getNamedItem("first").nodeValue,10),d=parseInt(u[o].attributes.getNamedItem("second").nodeValue,10),p=parseInt(u[o].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[c]=p}n.BitmapText.fonts[i.font]=i;var f=this;e.addEventListener("loaded",function(){f.onLoaded()}),e.load()}},n.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},n.SpineLoader=function(t,e){n.EventTarget.call(this),this.url=t,this.crossorigin=e,this.loaded=!1},n.SpineLoader.constructor=n.SpineLoader,n.SpineLoader.prototype.load=function(){new n.JsonLoader(this.url,this.crossorigin),jsonLoader.addEventListener("loaded",function(t){scope.json=t.content.json,scope.onJSONLoaded()}),jsonLoader.load()},n.SpineLoader.prototype.load=function(){var t=this,e=new n.JsonLoader(this.url,this.crossorigin);e.addEventListener("loaded",function(e){t.json=e.content.json,t.onJSONLoaded()}),e.load()},n.SpineLoader.prototype.onJSONLoaded=function(){var t=new u.SkeletonJson,e=t.readSkeletonData(this.json);n.AnimCache[this.url]=e,this.onLoaded()},n.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.PIXI=n):i.PIXI=n}).call(this); \ No newline at end of file diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index 92a3256..5169f98 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 8635994..81548d6 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index 1446b4d..94107cd 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 018c1bb..d7726fd 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index d769647..a99a3b5 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html index 1c3558a..5ddc684 100644 --- a/docs/classes/CustomRenderable.html +++ b/docs/classes/CustomRenderable.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index e213086..a05a037 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 13d76d9..8dd84bd 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index cab9245..ef2bccb 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index df4b990..ce8f8b3 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index d75b60d..82e90f4 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/JsonLoader.html b/docs/classes/JsonLoader.html index a97880a..98f9736 100644 --- a/docs/classes/JsonLoader.html +++ b/docs/classes/JsonLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index cdfa393..8f347ae 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Point.html b/docs/classes/Point.html index a259733..667aa0d 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html index d40772b..b5a0f66 100644 --- a/docs/classes/Polygon.html +++ b/docs/classes/Polygon.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 9207097..07046aa 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html index 7e465aa..3f2b12d 100644 --- a/docs/classes/RenderTexture.html +++ b/docs/classes/RenderTexture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html index 5068686..7a5f579 100644 --- a/docs/classes/Spine.html +++ b/docs/classes/Spine.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index 739bc40..6158520 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index 30efbcc..312f2e3 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index e8e5ff1..ce39926 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Text.html b/docs/classes/Text.html index 5101bab..3bf77ad 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 04a5a8f..c252d4a 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 1238c80..5ebf7fb 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 58f4bd5..a5530ff 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 1e8d2d9..a184105 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -411,7 +411,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:143 + src/pixi/renderers/webgl/WebGLRenderer.js:115

@@ -504,7 +504,7 @@ - src/pixi/renderers/webgl/WebGLRenderer.js:285 + src/pixi/renderers/webgl/WebGLRenderer.js:257

diff --git a/docs/data.json b/docs/data.json index b4f41e1..14143b4 100644 --- a/docs/data.json +++ b/docs/data.json @@ -2,7 +2,7 @@ "project": { "name": "Pixi.JS", "description": "Pixi.js is a fast lightweight 2D library that works across all devices.", - "version": "1.0.0", + "version": "1.3.0", "url": "http://goodboydigital.com/", "logo": "http://www.goodboydigital.com/pixijs/logo_small.png" }, @@ -2254,21 +2254,21 @@ }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 217, + "line": 218, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 252, + "line": 253, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/canvas/CanvasRenderer.js", - "line": 281, + "line": 282, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -2496,28 +2496,28 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 81, + "line": 84, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 96, + "line": 99, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 106, + "line": 109, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 143, + "line": 115, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -2532,14 +2532,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 226, + "line": 198, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 285, + "line": 257, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -2559,14 +2559,14 @@ }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 309, + "line": 281, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/webgl/WebGLRenderer.js", - "line": 318, + "line": 290, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -3390,15 +3390,15 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:218" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:253" }, { "message": "Missing item type", - "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281" + "line": " src/pixi/renderers/canvas/CanvasRenderer.js:282" }, { "message": "Missing item type", @@ -3458,27 +3458,27 @@ }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:84" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:99" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:109" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:198" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:281" }, { "message": "Missing item type", - "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318" + "line": " src/pixi/renderers/webgl/WebGLRenderer.js:290" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index 23748ff..15c7108 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index f1aeb3e..30f0a05 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index 3c1fd76..8727150 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index dab9bbf..8d6c891 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Point.js.html b/docs/files/src_pixi_core_Point.js.html index 0dbecad..dfa8f92 100644 --- a/docs/files/src_pixi_core_Point.js.html +++ b/docs/files/src_pixi_core_Point.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html index 0305f85..49afd1b 100644 --- a/docs/files/src_pixi_core_Polygon.js.html +++ b/docs/files/src_pixi_core_Polygon.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_core_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html index f8bc08b..2422cfd 100644 --- a/docs/files/src_pixi_core_Rectangle.js.html +++ b/docs/files/src_pixi_core_Rectangle.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html index 63ac0da..69204be 100644 --- a/docs/files/src_pixi_display_DisplayObject.js.html +++ b/docs/files/src_pixi_display_DisplayObject.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html index bb24166..4f4008e 100644 --- a/docs/files/src_pixi_display_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html index d9670b7..acc4d11 100644 --- a/docs/files/src_pixi_display_MovieClip.js.html +++ b/docs/files/src_pixi_display_MovieClip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html index fd5f491..bc6c1c8 100644 --- a/docs/files/src_pixi_display_Sprite.js.html +++ b/docs/files/src_pixi_display_Sprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_display_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html index 391fd51..1a037da 100644 --- a/docs/files/src_pixi_display_Stage.js.html +++ b/docs/files/src_pixi_display_Stage.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_CustomRenderable.js.html b/docs/files/src_pixi_extras_CustomRenderable.js.html index df4888b..dcd1cb5 100644 --- a/docs/files/src_pixi_extras_CustomRenderable.js.html +++ b/docs/files/src_pixi_extras_CustomRenderable.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 4164444..9fcdb30 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Spine.js.html b/docs/files/src_pixi_extras_Spine.js.html index 82f2a74..ec43a80 100644 --- a/docs/files/src_pixi_extras_Spine.js.html +++ b/docs/files/src_pixi_extras_Spine.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index 707f69c..30760ac 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index bf66ef2..8713195 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 8cc5414..743efb3 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 60d87a8..82d03bc 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index 49420a5..d890a35 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_JsonLoader.js.html b/docs/files/src_pixi_loaders_JsonLoader.js.html index dc9f17c..4f3f218 100644 --- a/docs/files/src_pixi_loaders_JsonLoader.js.html +++ b/docs/files/src_pixi_loaders_JsonLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpineLoader.js.html b/docs/files/src_pixi_loaders_SpineLoader.js.html index dad29d2..c0cfb1f 100644 --- a/docs/files/src_pixi_loaders_SpineLoader.js.html +++ b/docs/files/src_pixi_loaders_SpineLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 109bc09..a28a0a6 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html index 3199bcb..d87640a 100644 --- a/docs/files/src_pixi_primitives_Graphics.js.html +++ b/docs/files/src_pixi_primitives_Graphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -178,15 +178,12 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); - - // TODO store the last position of the line in the current } diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html index 3a5ace4..52c65ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html index 721e96f..16b67ec 100644 --- a/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -339,6 +339,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } diff --git a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html index 72d3ef4..a588f72 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html index 4547b28..9b05739 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -164,7 +164,6 @@ // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; if(graphics.dirty) @@ -182,13 +181,11 @@ PIXI.WebGLGraphics.initGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, 400, 300); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - //shaderProgram.colorAttribute + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); @@ -536,52 +533,6 @@ -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} -
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html index b4013ab..fe41d16 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html index 76ddae5..2341f27 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -196,8 +196,10 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -209,6 +211,7 @@ gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); + this.resize(this.width, this.height); this.contextLost = false; @@ -246,38 +249,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** diff --git a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html index 5cd680b..d0bb73a 100644 --- a/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
@@ -168,11 +168,64 @@ "}" ]; + + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + /* * primitive shader.. */ +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); @@ -210,6 +263,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -217,13 +289,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index c8f4d4c..fed242f 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 042193f..4389928 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 2b12119..e125009 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html index b486c58..667d69f 100644 --- a/docs/files/src_pixi_textures_RenderTexture.js.html +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index fb7afe4..1628858 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 9aa0858..c447d4d 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 56b926c..d879f77 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index 6f4410c..7568622 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/index.html b/docs/index.html index 1c204a9..14ca4e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index aa835ff..27f104a 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -19,7 +19,7 @@
- API Docs for: 1.0.0 + API Docs for: 1.3.0
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i - - + diff --git a/examples/example 13 - Graphics/pixi.js b/examples/example 13 - Graphics/pixi.js index 21e9a00..dee3aca 100644 --- a/examples/example 13 - Graphics/pixi.js +++ b/examples/example 13 - Graphics/pixi.js @@ -1,10 +1,10 @@ /** * @license - * Pixi.JS - v1.0.0 + * Pixi.JS - v1.3.0 * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-06-20 + * Compiled: 2013-06-21 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -242,6 +242,50 @@ return dest; } +PIXI.mat3.clone = function(mat) +{ + var matrix = new PIXI.Matrix(9); + + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; + + return matrix; +} + +PIXI.mat3.transpose = function (mat, dest) +{ + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (!dest || mat === dest) { + var a01 = mat[1], a02 = mat[2], + a12 = mat[5]; + + mat[1] = mat[3]; + mat[2] = mat[6]; + mat[3] = a01; + mat[5] = mat[7]; + mat[6] = a02; + mat[7] = a12; + return mat; + } + + dest[0] = mat[0]; + dest[1] = mat[3]; + dest[2] = mat[6]; + dest[3] = mat[1]; + dest[4] = mat[4]; + dest[5] = mat[7]; + dest[6] = mat[2]; + dest[7] = mat[5]; + dest[8] = mat[8]; + return dest; +} PIXI.mat3.toMat4 = function (mat, dest) { @@ -2461,10 +2505,145 @@ + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + This is an amazing lib! + + slightly modified by mat groves (matgroves.com); + * */ + + PIXI.PolyK = {}; + + PIXI.PolyK.Triangulate = function(p) + { + var sign = true; + + var n = p.length>>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + + /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -2480,20 +2659,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -2532,6 +2808,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -2539,13 +2834,10 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } @@ -2568,15 +2860,15 @@ // constructor PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; -PIXI.WebGLGraphics.renderGraphics = function(graphics) +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { PIXI.activatePrimitiveShader(); var gl = PIXI.gl; - // graphicsObject // a collection of "shapes" (mainly lines right now!) - ///this.shape.draw(); - if(!graphics._webGL)graphics._webGL = {points:[], lastPosition:new PIXI.Point(), lastIndex:0, buffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; if(graphics.dirty) { @@ -2590,30 +2882,46 @@ graphics._webGL.points = []; } - PIXI.WebGLGraphics.initGraphics(graphics); + PIXI.WebGLGraphics.updateGraphics(graphics); } - gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix ); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.vertexAttribPointer(PIXI.shaderProgram2.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.shaderProgram2.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - //shaderProgram.colorAttribute + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... PIXI.activateDefaultShader(); } -PIXI.WebGLGraphics.initGraphics = function(graphics) +PIXI.WebGLGraphics.updateGraphics = function(graphics) { for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; + if(data.type == PIXI.Graphics.POLY) { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -2623,21 +2931,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -2657,16 +2968,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -2681,8 +2991,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -2706,9 +3016,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -2721,26 +3032,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -2749,8 +3058,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -2760,6 +3069,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -2784,12 +3095,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -2799,7 +3117,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -2807,12 +3126,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -2825,27 +3141,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -2860,18 +3193,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -2880,22 +3215,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -2903,96 +3286,9 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} - /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ @@ -3051,8 +3347,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -3063,7 +3362,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -3101,38 +3401,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -3181,7 +3450,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -3189,10 +3458,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -3293,12 +3562,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -3967,15 +4239,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -3992,28 +4266,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -4095,28 +4371,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -4130,22 +4393,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -4155,21 +4407,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -4178,17 +4418,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -4442,6 +4690,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -4677,7 +4926,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -4713,17 +4961,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -4752,8 +5009,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -4779,11 +5034,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } @@ -5054,6 +5309,7 @@ } else if(displayObject instanceof PIXI.Graphics) { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) PIXI.CanvasGraphics.renderGraphics(displayObject, context); } @@ -5231,11 +5487,11 @@ context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - context.globalAlpha = data.lineAlpha; if(data.type == PIXI.Graphics.POLY) { - if(data.lineWidth <= 0)continue; + + //if(data.lineWidth <= 0)continue; context.beginPath(); @@ -5252,20 +5508,31 @@ context.closePath(); } - context.stroke(); + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } } else if(data.type == PIXI.Graphics.RECT) { // TODO - need to be Undefined! if(data.fillColor) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; context.strokeRect(points[0], points[1], points[2], points[3]); } } @@ -5278,11 +5545,56 @@ if(data.fill) { + context.globalAlpha = data.fillAlpha; context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { + context.globalAlpha = data.lineAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.globalAlpha = data.fillAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha; context.stroke(); } } @@ -5297,9 +5609,9 @@ /** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() @@ -5308,9 +5620,6 @@ this.renderable = true; - // style - color - // style - thickness - // alpha - this.fillAlpha = 1; this.lineWidth = 2; @@ -5318,46 +5627,68 @@ this.graphicsData = []; + this.currentPath = {points:[]}; } -// SOME TYPES: -PIXI.Graphics.POLY = 0; -PIXI.Graphics.RECT = 1; -PIXI.Graphics.CIRC = 2; - // constructor PIXI.Graphics.constructor = PIXI.Graphics; PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha == undefined) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - // TODO store the last position of the line in the current + this.graphicsData.push(this.currentPath); } - +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.moveTo = function(x, y) { - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); } +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; } +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; @@ -5365,6 +5696,9 @@ this.fillAlpha = alpha || 1; } +/** + * @method endFill + */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; @@ -5372,14 +5706,17 @@ this.fillAlpha = 1; } -PIXI.Graphics.prototype.updateTransform = function() -{ - if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); -} - +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[x, y, width, height], type:PIXI.Graphics.RECT}; @@ -5388,16 +5725,46 @@ this.dirty = true; } +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius], type:PIXI.Graphics.CIRC}; + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; this.graphicsData.push(this.currentPath); this.dirty = true; } +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + if(this.currentPath.points.length == 0)this.graphicsData.pop(); + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ PIXI.Graphics.prototype.clear = function() { this.dirty = true; @@ -5405,6 +5772,12 @@ this.graphicsData = []; } +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; + /** * @author Mat Groves http://matgroves.com/ */ @@ -7599,6 +7972,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -7649,6 +8024,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); @@ -72,21 +88,24 @@ { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } }; - //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) graphics._webGL.lastIndex = graphics.graphicsData.length; - // convert to points - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -106,16 +125,15 @@ { var color = HEXtoRGB(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; - - // dead triangle - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + var indices = webGLData.indices; + + var vertPos = verts.length/6; // start verts.push(x, y); @@ -130,8 +148,8 @@ verts.push(x + width, y + height); verts.push(r, g, b, alpha); - webGLData.lastPosition.x = x + width; - webGLData.lastPosition.y = y + height; + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) } if(graphicsData.lineWidth) @@ -155,9 +173,10 @@ var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; - var radius = rectData[2]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40 + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; if(graphicsData.fill) @@ -170,26 +189,24 @@ var b = color[2] * alpha; var verts = webGLData.points; + var indices = webGLData.indices; + + var vecPos = verts.length/6; - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(x, y, 1, 1, 1, 1); + indices.push(vecPos); for (var i=0; i < totalSegs + 1 ; i++) { - verts.push(x,y); - verts.push(r, g, b, alpha); + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - verts.push(r, g, b, alpha); + indices.push(vecPos++, vecPos++); }; - verts.push(x,y); - verts.push(1, 0, 0, 1); - - webGLData.lastPosition.x = x; - webGLData.lastPosition.y = y; + indices.push(vecPos-1); } if(graphicsData.lineWidth) @@ -198,8 +215,8 @@ for (var i=0; i < totalSegs + 1; i++) { - graphicsData.points.push(x + Math.sin(seg * i) * radius, - y + Math.cos(seg * i) * radius) + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) }; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); @@ -209,6 +226,8 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { + // TODO OPTIMISE! + var wrap = true; var points = graphicsData.points; if(points.length == 0)return; @@ -233,12 +252,19 @@ } var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length;// + 2; + + var indexStart = verts.length/6; + // DRAW the Line var width = graphicsData.lineWidth / 2; + // sort color var color = HEXtoRGB(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; @@ -248,7 +274,8 @@ // i = 0 // var point1 = new PIXI.Point( points[0], points[1] ); var point2 = new PIXI.Point( points[2], points[3] ); - var perp = getPerp(point1, point2); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; @@ -256,12 +283,9 @@ perp.x *= width; perp.y *= width; - // insert dead triangle! - verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); - verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); - // start + verts.push(points[0] - perp.x , points[1] - perp.y); verts.push(r, g, b, alpha); @@ -274,27 +298,44 @@ var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; - var perp2 = getPerp(point2, point3); + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); perp2.x /= dist2; perp2.y /= dist2; perp2.x *= width; perp2.y *= width; - var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); - var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); - var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); - var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); - var p = lineIntersectLine(p1, p1_, p2, p2_); + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); @@ -309,18 +350,20 @@ verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x + perp3.x, point2.y +perp3.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - perp3.x, point2.y -perp3.y); verts.push(r, g, b, alpha); + + indexCount++; } else { verts.push(p.x , p.y); verts.push(r, g, b, alpha); - + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); verts.push(r, g, b, alpha); } @@ -329,22 +372,70 @@ var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); - var perp = getPerp(point1, point2); + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); perp.x /= dist; perp.y /= dist; perp.x *= width; perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) verts.push(r, g, b, alpha); verts.push(point2.x + perp.x , point2.y + perp.y) verts.push(r, g, b, alpha); - // set last triangle! - webGLData.lastPosition.x = point2.x + perp.x; - webGLData.lastPosition.y = point2.y + perp.y; + indices.push(indexStart); + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart++); + }; + + indices.push(indexStart-1); +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var triangles = PIXI.PolyK.Triangulate(points); + + + + var vertPos = verts.length / 6; + + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + indices.push(triangles[i+2] + vertPos); + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; } function HEXtoRGB(hex) { @@ -352,92 +443,5 @@ } -function normalise(point) -{ - var dist = Math.sqrt(point.x * point.x + point.y * point.y); - return new PIXI.Point(point.x / dist, point.y / dist); -} - -function getPerp(point, point2) -{ - return new PIXI.Point(-(point.y - point2.y), point.x - point2.x); -} - -function lineIntersectLine(A,B,E,F) -{ - var ip; - var a1; - var a2; - var b1; - var b2; - var c1; - var c2; - - a1= B.y-A.y; - b1= A.x-B.x; - c1= B.x*A.y - A.x*B.y; - a2= F.y-E.y; - b2= E.x-F.x; - c2= F.x*E.y - E.x*F.y; - - var denom=a1*b2 - a2*b1; - - if (denom == 0) { - // return null; - console.log("!") - denom+=1; - } - ip=new PIXI.Point(); - ip.x=(b1*c2 - b2*c1)/denom; - ip.y=(a2*c1 - a1*c2)/denom; - - return ip; -} - -PIXI.primitiveShaderFragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" -]; - -PIXI.primitiveShaderVertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat4 uMVMatrix;", - "varying vec4 vColor;", - "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", - "vColor = aColor;", - "}" -]; - - -PIXI.WebGLGraphics.initShaders = function() -{ - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc); - - PIXI.shaderProgram2 = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram2; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); -} diff --git a/src/pixi/renderers/webgl/WebGLRenderGroup.js b/src/pixi/renderers/webgl/WebGLRenderGroup.js index a193406..ba26f06 100644 --- a/src/pixi/renderers/webgl/WebGLRenderGroup.js +++ b/src/pixi/renderers/webgl/WebGLRenderGroup.js @@ -43,15 +43,17 @@ //displayObject } -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) +PIXI.WebGLRenderGroup.prototype.render = function(projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + // TODO remove this by replacing visible with getter setters.. this.checkVisibility(this.root, this.root.visible); @@ -68,28 +70,30 @@ } else if(renderable instanceof PIXI.TilingSprite) { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + if(renderable.visible)this.renderTilingSprite(renderable, projection); } else if(renderable instanceof PIXI.Strip) { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projection); } else if(renderable instanceof PIXI.Graphics) { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); } } } -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { PIXI.WebGLRenderer.updateTextures(); var gl = this.gl; this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + //console.log("SPECIFIC"); // to do! @@ -171,28 +175,15 @@ // TODO - need to fold this up a bit! - if(startBatch == endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { startBatch.render(startIndex, endIndex+1); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(startBatch); } return; } @@ -206,22 +197,11 @@ { startBatch.render(startIndex); } - else if(startBatch instanceof PIXI.TilingSprite) + else { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); + this.renderSpecial(startBatch); } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); - } + // DO the middle batchs.. for (var i=startBatchIndex+1; i < endBatchIndex; i++) { @@ -231,21 +211,9 @@ { this.batchs[i].render(); } - else if(renderable instanceof PIXI.TilingSprite) + else { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - else if(renderable instanceof PIXI.Graphics) - { - if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + this.renderSpecial(renderable); } } @@ -254,17 +222,25 @@ { endBatch.render(0, endIndex+1); } - else if(endBatch instanceof PIXI.TilingSprite) + else { - if(endBatch.visible)this.renderTilingSprite(endBatch); + this.renderSpecial(endBatch); } - else if(endBatch instanceof PIXI.Strip) +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) { - if(endBatch.visible)this.renderStrip(endBatch); + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); } - else if(endBatch instanceof PIXI.CustomRenderable) + else if(renderable instanceof PIXI.Strip) { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); } else if(renderable instanceof PIXI.Graphics) { @@ -518,6 +494,7 @@ } else if(displayObject instanceof PIXI.TilingSprite) { + // add to a batch!! this.initTilingSprite(displayObject); this.batchs.push(displayObject); @@ -753,7 +730,6 @@ sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); @@ -789,17 +765,26 @@ /** * @private */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { var gl = this.gl; var shaderProgram = PIXI.shaderProgram; // mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + if(strip.blendMode == PIXI.blendModes.NORMAL) { gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -828,8 +813,6 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - } else { @@ -855,11 +838,11 @@ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); } - //console.log(gl.TRIANGLE_STRIP) + //console.log(gl.TRIANGLE_STRIP); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - + gl.useProgram(PIXI.shaderProgram); } diff --git a/src/pixi/renderers/webgl/WebGLRenderer.js b/src/pixi/renderers/webgl/WebGLRenderer.js index 7b43b52..112407c 100644 --- a/src/pixi/renderers/webgl/WebGLRenderer.js +++ b/src/pixi/renderers/webgl/WebGLRenderer.js @@ -56,8 +56,11 @@ throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } - PIXI.WebGLGraphics.initShaders(); - this.initShaders(); + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); var gl = this.gl; PIXI.WebGLRenderer.gl = gl; @@ -68,7 +71,8 @@ gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); - this.projectionMatrix = PIXI.mat4.create(); + PIXI.projection = new PIXI.Point(400, 300); + this.resize(this.width, this.height); this.contextLost = false; @@ -106,38 +110,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.initShaders = function() -{ - var gl = this.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.shaderFragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, PIXI.shaderVertexSrc); - - PIXI.shaderProgram = gl.createProgram(); - - var shaderProgram = PIXI.shaderProgram; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert("Could not initialise shaders"); - } - - gl.useProgram(shaderProgram); - - shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); - - shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); - - - shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); - shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - - PIXI.activateDefaultShader(); -} /** @@ -186,7 +159,7 @@ gl.viewport(0, 0, this.width, this.height); // set the correct matrix.. - // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); gl.bindFramebuffer(gl.FRAMEBUFFER, null); @@ -194,10 +167,10 @@ gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - PIXI.projectionMatrix = this.projectionMatrix; + //PIXI.projectionMatrix = this.projectionMatrix; this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(this.projectionMatrix); + this.stageRenderGroup.render(PIXI.projection); // interaction // run interaction! @@ -298,12 +271,15 @@ this.gl.viewport(0, 0, this.width, this.height); - var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** diff --git a/src/pixi/renderers/webgl/WebGLShaders.js b/src/pixi/renderers/webgl/WebGLShaders.js index 139ede9..2ba3c51 100644 --- a/src/pixi/renderers/webgl/WebGLShaders.js +++ b/src/pixi/renderers/webgl/WebGLShaders.js @@ -3,6 +3,11 @@ * @author Mat Groves http://matgroves.com/ @Doormat23 */ + +/* + * the default suoer fast shader! + */ + PIXI.shaderFragmentSrc = [ "precision mediump float;", "varying vec2 vTextureCoord;", @@ -18,20 +23,117 @@ "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "attribute float aColor;", - "uniform mat4 uMVMatrix;", + //"uniform mat4 uMVMatrix;", + "uniform vec2 projectionVector;", "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", "}" ]; /* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* * primitive shader.. */ +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} PIXI.CompileVertexShader = function(gl, shaderSrc) { @@ -70,6 +172,25 @@ gl.enableVertexAttribArray(shaderProgram.colorAttribute); } +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; @@ -77,12 +198,9 @@ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - var shaderProgram2 = PIXI.shaderProgram2; + gl.useProgram(PIXI.primitiveProgram); - gl.useProgram(shaderProgram2); - - gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute); - + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/src/pixi/textures/RenderTexture.js b/src/pixi/textures/RenderTexture.js index 3c13ad6..537cd94 100644 --- a/src/pixi/textures/RenderTexture.js +++ b/src/pixi/textures/RenderTexture.js @@ -65,6 +65,8 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + this.projectionMatrix = PIXI.mat4.create(); this.projectionMatrix[5] = 2/this.height// * 0.5; @@ -115,6 +117,9 @@ //TODO -? create a new one??? dont think so! displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; for(var i=0,j=children.length; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) + { + earFound = true; + for(var j=0; j 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + var tgs = []; + avl = []; + for(var i=0; i= 0) && (v >= 0) && (u + v < 1); + } + + + PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) + { + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + } + \ No newline at end of file diff --git a/src/pixi/utils/pixi.js example 13 - Graphics.html b/src/pixi/utils/pixi.js example 13 - Graphics.html new file mode 100644 index 0000000..3115e6c --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics.html @@ -0,0 +1,203 @@ + + + + pixi.js example 13 - Graphics + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasGraphics.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasGraphics.js new file mode 100644 index 0000000..ac9c961 --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasGraphics.js @@ -0,0 +1,129 @@ +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + +/** + * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. + * @class DisplayObjectContainer + * @extends DisplayObject + * @constructor + */ +PIXI.CanvasGraphics = function() +{ + +} + +// constructor + +PIXI.CanvasGraphics.renderGraphics = function(graphics, context) +{ + + for (var i=0; i < graphics.graphicsData.length; i++) + { + var data = graphics.graphicsData[i]; + var points = data.points; + + context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); + + context.lineWidth = data.lineWidth; + context.globalAlpha = data.lineAlpha; + + if(data.type == PIXI.Graphics.POLY) + { + if(data.lineWidth <= 0)continue; + + context.beginPath(); + + context.moveTo(points[0], points[1]); + + for (var j=1; j < points.length/2; j++) + { + context.lineTo(points[j * 2], points[j * 2 + 1]); + } + + // if the first and last point are the same close the path - much neater :) + if(points[0] == points[points.length-2] && points[1] == points[points.length-1]) + { + context.closePath(); + } + + context.stroke(); + } + else if(data.type == PIXI.Graphics.RECT) + { + // TODO - need to be Undefined! + if(data.fillColor) + { + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + + context.fillRect(points[0], points[1], points[2], points[3]); + + } + if(data.lineWidth) + { + context.strokeRect(points[0], points[1], points[2], points[3]); + } + } + else if(data.type == PIXI.Graphics.CIRC) + { + // TODO - need to be Undefined! + context.beginPath(); + context.arc(points[0], points[1], points[2],0,2*Math.PI); + context.closePath(); + + if(data.fill) + { + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { + + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + + var elipseData = data.points; + + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; + + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; + + context.beginPath(); + + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + context.closePath(); + + if(data.fill) + { + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.stroke(); + } + } + + + }; +} diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasRenderer.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasRenderer.js new file mode 100644 index 0000000..7cb832c --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/CanvasRenderer.js @@ -0,0 +1 @@ +

File /pixi.js/src/pixi/renderers/CanvasRenderer.js not found

\ No newline at end of file diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/Graphics.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/Graphics.js new file mode 100644 index 0000000..a6a0667 --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/Graphics.js @@ -0,0 +1,163 @@ +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + +/** + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer + * @constructor + */ +PIXI.Graphics = function() +{ + PIXI.DisplayObjectContainer.call( this ); + + this.renderable = true; + + this.fillAlpha = 1; + + this.lineWidth = 2; + this.lineColor = "#FF0000"; + + this.graphicsData = []; + +} + +// constructor +PIXI.Graphics.constructor = PIXI.Graphics; +PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); + +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ +PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) +{ + this.lineWidth = lineWidth || 0; + this.lineColor = color || 0; + this.lineAlpha = (alpha == undefined) ? 1 : alpha; + + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + this.graphicsData.push(this.currentPath); +} + +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ +PIXI.Graphics.prototype.moveTo = function(x, y) +{ + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + + // {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + + this.currentPath.points.push(x, y); + + this.graphicsData.push(this.currentPath); +} + +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ +PIXI.Graphics.prototype.lineTo = function(x, y) +{ + this.currentPath.points.push(x, y); + this.dirty = true; +} + +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ +PIXI.Graphics.prototype.beginFill = function(color, alpha) +{ + this.filling = true; + this.fillColor = color || 0; + this.fillAlpha = alpha || 1; +} + +/** + * @method endFill + */ +PIXI.Graphics.prototype.endFill = function() +{ + this.filling = false; + this.fillColor = null; + this.fillAlpha = 1; +} + +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) +{ + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.RECT}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ +PIXI.Graphics.prototype.drawCircle = function( x, y, radius) +{ + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method drawElipse + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) +{ + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ +PIXI.Graphics.prototype.clear = function() +{ + this.dirty = true; + this.clearDirty = true; + this.graphicsData = []; +} + +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; +PIXI.Graphics.ELIP = 3; diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/Polyk.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/Polyk.js new file mode 100644 index 0000000..f61d0c6 --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/Polyk.js @@ -0,0 +1,473 @@ + + /* + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. + + Copyright (c) 2012 Ivan Kuckir + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + */ + + var PolyK = {}; + + /* + Is Polygon self-intersecting? + + O(n^2) + */ + + PolyK.IsSimple = function(p) + { + var n = p.length>>1; + if(n<4) return true; + var a1 = new PolyK._P(), a2 = new PolyK._P(); + var b1 = new PolyK._P(), b2 = new PolyK._P(); + var c = new PolyK._P(); + + for(var i=0; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; + + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; + + var earFound = false; + if(PolyK._convex(ax, ay, bx, by, cx, cy)) + { + earFound = true; + for(var j=0; j 3*al) break; // no convex angles :( + } + tgs.push(avl[0], avl[1], avl[2]); + return tgs; + } + + PolyK.ContainsPoint = function(p, px, py) + { + var n = p.length>>1; + var ax, ay, bx = p[2*n-2]-px, by = p[2*n-1]-py; + var depth = 0; + for(var i=0; i=0 && by>=0) continue; // both "up" or both "donw" + if(ax< 0 && bx< 0) continue; + + var lx = ax + (bx-ax)*(-ay)/(by-ay); + if(lx>0) depth++; + } + return (depth & 1) == 1; + } + + PolyK.Slice = function(p, ax, ay, bx, by) + { + if(PolyK.ContainsPoint(p, ax, ay) || PolyK.ContainsPoint(p, bx, by)) return [p.slice(0)]; + + var a = new PolyK._P(ax, ay); + var b = new PolyK._P(bx, by); + var iscs = []; // intersections + var ps = []; // points + for(var i=0; i 0) + { + var n = ps.length; + var i0 = iscs[0]; + var i1 = iscs[1]; + var ind0 = ps.indexOf(i0); + var ind1 = ps.indexOf(i1); + var solved = false; + + if(PolyK._firstWithFlag(ps, ind0) == ind1) solved = true; + else + { + i0 = iscs[1]; + i1 = iscs[0]; + ind0 = ps.indexOf(i0); + ind1 = ps.indexOf(i1); + if(PolyK._firstWithFlag(ps, ind0) == ind1) solved = true; + } + if(solved) + { + dir--; + var pgn = PolyK._getPoints(ps, ind0, ind1); + pgs.push(pgn); + ps = PolyK._getPoints(ps, ind1, ind0); + i0.flag = i1.flag = false; + iscs.splice(0,2); + if(iscs.length == 0) pgs.push(ps); + } + else { dir++; iscs.reverse(); } + if(dir>1) break; + } + var result = []; + for(var i=0; i>1, isc); + } + b1.x = b2.x; b1.y = b2.y; + b2.x = p[0]; b2.y = p[1]; + PolyK._pointLineDist(a1, b1, b2, l>>1, isc); + + var idst = 1/isc.dist; + isc.norm.x = (x-isc.point.x)*idst; + isc.norm.y = (y-isc.point.y)*idst; + return isc; + } + + PolyK._pointLineDist = function(p, a, b, edge, isc) + { + var x = p.x, y = p.y, x1 = a.x, y1 = a.y, x2 = b.x, y2 = b.y; + + var A = x - x1; + var B = y - y1; + var C = x2 - x1; + var D = y2 - y1; + + var dot = A * C + B * D; + var len_sq = C * C + D * D; + var param = dot / len_sq; + + var xx, yy; + + if (param < 0 || (x1 == x2 && y1 == y2)) { + xx = x1; + yy = y1; + } + else if (param > 1) { + xx = x2; + yy = y2; + } + else { + xx = x1 + param * C; + yy = y1 + param * D; + } + + var dx = x - xx; + var dy = y - yy; + var dst = Math.sqrt(dx * dx + dy * dy); + if(dst= 0) && (v >= 0) && (u + v < 1); + } + + PolyK._RayLineIntersection = function(a1, a2, b1, b2, c) + { + var dax = (a1.x-a2.x), dbx = (b1.x-b2.x); + var day = (a1.y-a2.y), dby = (b1.y-b2.y); + + var Den = dax*dby - day*dbx; + if (Den == 0) return null; // parallel + + var A = (a1.x * a2.y - a1.y * a2.x); + var B = (b1.x * b2.y - b1.y * b2.x); + + var I = c; + var iDen = 1/Den; + I.x = ( A*dbx - dax*B ) * iDen; + I.y = ( A*dby - day*B ) * iDen; + + if(!PolyK._InRect(I, b1, b2)) return null; + if((day>0 && I.y>a1.y) || (day<0 && I.y0 && I.x>a1.x) || (dax<0 && I.x=Math.min(b.y, c.y) && a.y<=Math.max(b.y, c.y)); + if (b.y == c.y) return (a.x>=Math.min(b.x, c.x) && a.x<=Math.max(b.x, c.x)); + + if(a.x >= Math.min(b.x, c.x) && a.x <= Math.max(b.x, c.x) + && a.y >= Math.min(b.y, c.y) && a.y <= Math.max(b.y, c.y)) + return true; + return false; + } + + PolyK._convex = function(ax, ay, bx, by, cx, cy) + { + return (ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0; + } + + PolyK._P = function(x,y) + { + this.x = x; + this.y = y; + this.flag = false; + } + PolyK._P.prototype.toString = function() + { + return "Point ["+this.x+", "+this.y+"]"; + } + PolyK._P.dist = function(a,b) + { + var dx = b.x-a.x; + var dy = b.y-a.y; + return Math.sqrt(dx*dx + dy*dy); + } + + PolyK._tp = []; + for(var i=0; i<10; i++) PolyK._tp.push(new PolyK._P(0,0)); \ No newline at end of file diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/WebGLGraphics.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/WebGLGraphics.js new file mode 100644 index 0000000..51edba5 --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/WebGLGraphics.js @@ -0,0 +1,466 @@ +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + +/** + * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. + * @class DisplayObjectContainer + * @extends DisplayObject + * @constructor + */ +PIXI.WebGLGraphics = function() +{ + +} + +// constructor +PIXI.WebGLGraphics.constructor = PIXI.WebGLGraphics; + +PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) +{ + PIXI.activatePrimitiveShader(); + var gl = PIXI.gl; + + // graphicsObject + // a collection of "shapes" (mainly lines right now!) + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastPosition:new PIXI.Point(), lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; + + if(graphics.dirty) + { + graphics.dirty = false; + + if(graphics.clearDirty) + { + graphics.clearDirty = false; + + graphics._webGL.lastIndex = 0; + graphics._webGL.points = []; + } + + PIXI.WebGLGraphics.updateGraphics(graphics); + } + + // This could be speeded up fo sure! + + var m = PIXI.mat3.clone(graphics.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + + //gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6); + + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + // return to default shader... + PIXI.activateDefaultShader(); +} + +PIXI.WebGLGraphics.updateGraphics = function(graphics) +{ + for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) + { + var data = graphics.graphicsData[i]; + + + if(data.type == PIXI.Graphics.POLY) + { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } + + if(data.lineWidth > 0) + { + PIXI.WebGLGraphics.buildLine(data, graphics._webGL); + } + + } + else if(data.type == PIXI.Graphics.RECT) + { + PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); + } + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) + { + PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); + } + }; + + //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) + graphics._webGL.lastIndex = graphics.graphicsData.length; + + // convert to points + var gl = PIXI.gl; + + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); + gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); +} + + +PIXI.WebGLGraphics.buildRectangle = function(graphicsData, webGLData) +{ + // --- // + // need to convert points to a nice regular data + // + var rectData = graphicsData.points; + var x = rectData[0]; + var y = rectData[1]; + var width = rectData[2]; + var height = rectData[3]; + + + if(graphicsData.fill) + { + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var verts = webGLData.points; + + // dead triangle + verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); + verts.push(x, y, 1, 1, 1, 1); + + // start + verts.push(x, y); + verts.push(r, g, b, alpha); + + verts.push(x + width, y); + verts.push(r, g, b, alpha); + + verts.push(x , y + height); + verts.push(r, g, b, alpha); + + verts.push(x + width, y + height); + verts.push(r, g, b, alpha); + + webGLData.lastPosition.x = x + width; + webGLData.lastPosition.y = y + height; + } + + if(graphicsData.lineWidth) + { + graphicsData.points = [x, y, + x + width, y, + x + width, y + height, + x, y + height, + x, y]; + + PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); + } + +} + +PIXI.WebGLGraphics.buildCircle = function(graphicsData, webGLData) +{ + // --- // + // need to convert points to a nice regular data + // + var rectData = graphicsData.points; + var x = rectData[0]; + var y = rectData[1]; + var width = rectData[2]; + var height = rectData[3]; + + var totalSegs = 40; + var seg = (Math.PI * 2) / totalSegs ; + + if(graphicsData.fill) + { + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var verts = webGLData.points; + + verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); + verts.push(x, y, 1, 1, 1, 1); + + for (var i=0; i < totalSegs + 1 ; i++) + { + verts.push(x,y); + verts.push(r, g, b, alpha); + + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height); + + verts.push(r, g, b, alpha); + }; + + verts.push(x,y); + verts.push(1, 0, 0, 1); + + webGLData.lastPosition.x = x; + webGLData.lastPosition.y = y; + } + + if(graphicsData.lineWidth) + { + graphicsData.points = []; + + for (var i=0; i < totalSegs + 1; i++) + { + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) + }; + + PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); + } + +} + +PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) +{ + // TODO OPTIMISE! + + var wrap = true; + var points = graphicsData.points; + if(points.length == 0)return; + + // get first and last point.. figure out the middle! + var firstPoint = new PIXI.Point( points[0], points[1] ); + var lastPoint = new PIXI.Point( points[points.length - 2], points[points.length - 1] ); + + // if the first point is the last point - goona have issues :) + if(firstPoint.x == lastPoint.x && firstPoint.y == lastPoint.y) + { + points.pop(); + points.pop(); + + lastPoint = new PIXI.Point( points[points.length - 2], points[points.length - 1] ); + + var midPointX = lastPoint.x + (firstPoint.x - lastPoint.x) *0.5; + var midPointY = lastPoint.y + (firstPoint.y - lastPoint.y) *0.5; + + points.unshift(midPointX, midPointY); + points.push(midPointX, midPointY) + } + + var verts = webGLData.points; + var indices = webGLData.indices; + + + var length = points.length / 2; + + var indexCount = points.length + 2; + + var indexStart = verts.length/6; + + // DRAW the Line + var width = graphicsData.lineWidth / 2; + + // sort color + var color = HEXtoRGB(graphicsData.lineColor); + var alpha = graphicsData.lineAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + // i = 0 // + var point1 = new PIXI.Point( points[0], points[1] ); + var point2 = new PIXI.Point( points[2], points[3] ); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); + var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); + + perp.x /= dist; + perp.y /= dist; + perp.x *= width; + perp.y *= width; + + // insert dead triangle as we are using a triangle strip + verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); + verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); + // start + + verts.push(points[0] - perp.x , points[1] - perp.y); + verts.push(r, g, b, alpha); + + verts.push(points[0] + perp.x , points[1] + perp.y); + verts.push(r, g, b, alpha); + + for (var i = 1; i < length-1; i++) + { + var point1 = new PIXI.Point( points[(i-1)*2],points[(i-1)*2 + 1] ); + var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); + var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); + var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); + perp.x /= dist; + perp.y /= dist; + perp.x *= width; + perp.y *= width; + + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); + var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); + perp2.x /= dist2; + perp2.y /= dist2; + perp2.x *= width; + perp2.y *= width; + + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + + + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); + + if(pdist > 140 * 140) + { + var perp3 = new PIXI.Point(perp.x - perp2.x, perp.y - perp2.y); + var dist3 = Math.sqrt(perp3.x*perp3.x + perp3.y*perp3.y); + perp3.x /= dist3; + perp3.y /= dist3; + perp3.x *= width; + perp3.y *= width; + + verts.push(point2.x - perp3.x, point2.y -perp3.y); + verts.push(r, g, b, alpha); + + verts.push(point2.x + perp3.x, point2.y +perp3.y); + verts.push(r, g, b, alpha); + + verts.push(point2.x - perp3.x, point2.y -perp3.y); + verts.push(r, g, b, alpha); + + indexCount++; + } + else + { + verts.push(p.x , p.y); + verts.push(r, g, b, alpha); + + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); + verts.push(r, g, b, alpha); + } + } + + var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); + var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); + //getPerp(point1, point2); + var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); + perp.x /= dist; + perp.y /= dist; + perp.x *= width; + perp.y *= width; + + verts.push(point2.x - perp.x , point2.y - perp.y) + verts.push(r, g, b, alpha); +// indices.push(indices.length) + + verts.push(point2.x + perp.x , point2.y + perp.y) + verts.push(r, g, b, alpha); +// indices.push(indices.length) + + for (var i=0; i < indexCount; i++) + { + indices.push(indexStart + i); + }; + // set last triangle! + webGLData.lastPosition.x = point2.x + perp.x; + webGLData.lastPosition.y = point2.y + perp.y; +} + + +PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) +{ + var points = graphicsData.points; + if(points.length < 6)return; + + // get first and last point.. figure out the middle! + + var verts = webGLData.points; + var indices = webGLData.indices; + + var length = points.length / 2; + + // sort color + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.lineAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + + + + var triangles = PolyK.Triangulate(graphicsData.points); + + // DEAD Triangle + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + indices.push(verts.length/6) + indices.push(verts.length/6) + + var vertPos = verts.length / 6; + for (var i=0; i < triangles.length; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + }; + + for (var i = 0; i < length; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + }; + +} + +function HEXtoRGB(hex) { + return [(hex >> 16 & 0xFF) / 255, ( hex >> 8 & 0xFF) / 255, (hex & 0xFF)/ 255]; +} + + + + diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/WebGLRenderer.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/WebGLRenderer.js new file mode 100644 index 0000000..112407c --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/WebGLRenderer.js @@ -0,0 +1,320 @@ +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + +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 :) + * @class WebGLRenderer + * @constructor + * @param width {Number} the width of the canvas view + * @default 0 + * @param height {Number} the height of the canvas view + * @default 0 + * @param view {Canvas} the canvas to use as a view, optional + * @param transparent {Boolean} the transparency of the render view, default false + * @default false + * + */ +PIXI.WebGLRenderer = function(width, height, view, transparent) +{ + // do a catch.. only 1 webGL renderer.. + + //console.log(transparent) + this.transparent = !!transparent; + + this.width = width || 800; + this.height = height || 600; + + this.view = view || document.createElement( 'canvas' ); + this.view.width = this.width; + this.view.height = this.height; + + // deal with losing context.. + var scope = this; + this.view.addEventListener('webglcontextlost', function(event) { scope.handleContextLost(event); }, false) + this.view.addEventListener('webglcontextrestored', function(event) { scope.handleContextRestored(event); }, false) + + this.batchs = []; + + try + { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { + alpha: this.transparent, + antialias:false, // SPEED UP?? + premultipliedAlpha:false + }); + } + catch (e) + { + throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); + } + + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); + + 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); + + PIXI.projection = new PIXI.Point(400, 300); + + this.resize(this.width, this.height); + this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); +} + +// constructor +PIXI.WebGLRenderer.constructor = PIXI.WebGLRenderer; + +/** + * @private + */ +PIXI.WebGLRenderer.getBatch = function() +{ + if(PIXI._batchs.length == 0) + { + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); + } + else + { + return PIXI._batchs.pop(); + } +} + +/** + * @private + */ +PIXI.WebGLRenderer.returnBatch = function(batch) +{ + batch.clean(); + PIXI._batchs.push(batch); +} + + +/** + * @private + */ + + + +/** + * Renders the stage to its webGL view + * @method render + * @param stage {Stage} the PIXI.Stage element to be rendered + */ +PIXI.WebGLRenderer.prototype.render = function(stage) +{ + if(this.contextLost)return; + + + // if rendering a new stage clear the batchs.. + if(this.__stage !== stage) + { + // TODO make this work + // dont think this is needed any more? + //if(this.__stage)this.checkVisibility(this.__stage, false) + + this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); + } + + // TODO not needed now... + // update children if need be + // best to remove first! + /*for (var i=0; i < stage.__childrenRemoved.length; i++) + { + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); + }*/ + + // update any textures + PIXI.WebGLRenderer.updateTextures(); + + // recursivly loop through all items! + //this.checkVisibility(stage, true); + + // update the scene graph + stage.updateTransform(); + + var gl = this.gl; + + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); + + // set the correct matrix.. + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], !this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // HACK TO TEST + //PIXI.projectionMatrix = this.projectionMatrix; + + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(PIXI.projection); + + // interaction + // run interaction! + if(stage.interactive) + { + //need to add some events! + if(!stage._interactiveEventsAdded) + { + stage._interactiveEventsAdded = true; + stage.interactionManager.setTarget(this); + } + } + + // after rendering lets confirm all frames that have been uodated.. + if(PIXI.Texture.frameUpdates.length > 0) + { + for (var i=0; i < PIXI.Texture.frameUpdates.length; i++) + { + PIXI.Texture.frameUpdates[i].updateFrame = false; + }; + + PIXI.Texture.frameUpdates = []; + } +} + +/** + * @private + */ + +PIXI.WebGLRenderer.updateTextures = function() +{ + for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); + for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); + PIXI.texturesToUpdate = []; + PIXI.texturesToDestroy = []; +} + +PIXI.WebGLRenderer.updateTexture = function(texture) +{ + var gl = PIXI.gl; + + if(!texture._glTexture) + { + texture._glTexture = gl.createTexture(); + } + + if(texture.hasLoaded) + { + gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); + gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + + // reguler... + + if(!texture._powerOf2) + { + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + } + else + { + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); + } + + gl.bindTexture(gl.TEXTURE_2D, null); + } + +} + +PIXI.WebGLRenderer.prototype.destroyTexture = function(texture) +{ + var gl = this.gl; + + if(texture._glTexture) + { + texture._glTexture = gl.createTexture(); + gl.deleteTexture(gl.TEXTURE_2D, texture._glTexture); + } +} + +/** + * resizes the webGL view to the specified width and height + * @method resize + * @param width {Number} the new width of the webGL view + * @param height {Number} the new height of the webGL view + */ +PIXI.WebGLRenderer.prototype.resize = function(width, height) +{ + this.width = width; + this.height = height; + + this.view.width = width; + this.view.height = height; + + this.gl.viewport(0, 0, this.width, this.height); + + //var projectionMatrix = this.projectionMatrix; + + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; +} + +/** + * @private + */ +PIXI.WebGLRenderer.prototype.handleContextLost = function(event) +{ + event.preventDefault(); + this.contextLost = true; +} + +/** + * @private + */ +PIXI.WebGLRenderer.prototype.handleContextRestored = function(event) +{ + this.gl = this.view.getContext("experimental-webgl", { + alpha: true + }); + + this.initShaders(); + + for (var i=0; i < PIXI.TextureCache.length; i++) + { + this.updateTexture(PIXI.TextureCache[i]); + }; + + for (var i=0; i < this.batchs.length; i++) + { + this.batchs[i].restoreLostContext(this.gl)// + this.batchs[i].dirty = true; + }; + + PIXI._restoreBatchs(this.gl); + + this.contextLost = false; +} + diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/WebGLShaders.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/WebGLShaders.js new file mode 100644 index 0000000..2ba3c51 --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/WebGLShaders.js @@ -0,0 +1,206 @@ + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + +/* + * the default suoer fast shader! + */ + +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;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + // "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);", + "gl_Position = vec4( aVertexPosition.x / projectionVector.x -1.0, aVertexPosition.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + +/* + * the triangle strip shader.. + */ +PIXI.stripShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec2 aTextureCoord;", + "attribute float aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec2 vTextureCoord;", + "varying float vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vTextureCoord = aTextureCoord;", + "vColor = aColor;", + "}" +]; + + +/* + * primitive shader.. + */ + +PIXI.primitiveShaderFragmentSrc = [ + "precision mediump float;", + "varying vec4 vColor;", + "void main(void) {", + "gl_FragColor = vColor;", + "}" +]; + +PIXI.primitiveShaderVertexSrc = [ + "attribute vec2 aVertexPosition;", + "attribute vec4 aColor;", + "uniform mat3 translationMatrix;", + "uniform vec2 projectionVector;", + "varying vec4 vColor;", + "void main(void) {", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", + "vColor = aColor;", + "}" +]; + +PIXI.initPrimitiveShader = function() +{ + var gl = PIXI.gl; + + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + PIXI.primitiveProgram = shaderProgram; +} + +PIXI.initDefaultShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.shaderProgram = shaderProgram; +} + +PIXI.initDefaultStripShader = function() +{ + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.shaderFragmentSrc) + + gl.useProgram(shaderProgram); + + shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + + shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); + + shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); + + PIXI.stripShaderProgram = shaderProgram; +} + +PIXI.CompileVertexShader = function(gl, shaderSrc) +{ + return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); +} + +PIXI.CompileFragmentShader = function(gl, shaderSrc) +{ + return PIXI._CompileShader(gl, shaderSrc, gl.FRAGMENT_SHADER); +} + +PIXI._CompileShader = function(gl, shaderSrc, shaderType) +{ + var src = shaderSrc.join("\n"); + var shader = gl.createShader(shaderType); + gl.shaderSource(shader, src); + gl.compileShader(shader); + + if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { + alert(gl.getShaderInfoLog(shader)); + return null; + } + + return shader; +} + +PIXI.activateDefaultShader = function() +{ + var gl = PIXI.gl; + var shaderProgram = PIXI.shaderProgram; + + gl.useProgram(shaderProgram); + + gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(shaderProgram.textureCoordAttribute); + gl.enableVertexAttribArray(shaderProgram.colorAttribute); +} + +PIXI.compileProgram = function(vertexSrc, fragmentSrc) +{ + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + alert("Could not initialise shaders"); + } + + return shaderProgram; +} + +PIXI.activatePrimitiveShader = function() +{ + var gl = PIXI.gl; + + gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); + gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); + + gl.useProgram(PIXI.primitiveProgram); + + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); +} + diff --git a/src/pixi/utils/pixi.js example 13 - Graphics_files/pixi.js b/src/pixi/utils/pixi.js example 13 - Graphics_files/pixi.js new file mode 100644 index 0000000..44b5923 --- /dev/null +++ b/src/pixi/utils/pixi.js example 13 - Graphics_files/pixi.js @@ -0,0 +1,8395 @@ +/** + * @license + * Pixi.JS - v1.3.0 + * Copyright (c) 2012, Mat Groves + * http://goodboydigital.com/ + * + * Compiled: 2013-06-21 + * + * Pixi.JS is licensed under the MIT License. + * http://www.opensource.org/licenses/mit-license.php + */ +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + +(function(){ + + var root = this; + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + +/** +@module PIXI + */ +var PIXI = PIXI || {}; + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + +/** + * The Point object represents a location in a two-dimensional coordinate system, where x represents the horizontal axis and y represents the vertical axis. + * @class Point + * @constructor + * @param x {Number} position of the point + * @param y {Number} position of the point + */ +PIXI.Point = function(x, y) +{ + /** + * @property x + * @type Number + * @default 0 + */ + this.x = x || 0; + + /** + * @property y + * @type Number + * @default 0 + */ + this.y = y || 0; +} + +/** + * @method clone + * @return a copy of the point + */ +PIXI.Point.prototype.clone = function() +{ + return new PIXI.Point(this.x, this.y); +} + +// constructor +PIXI.Point.constructor = PIXI.Point; + + +/** + * @author Mat Groves http://matgroves.com/ + */ + +/** + * the Rectangle object is an area defined by its position, as indicated by its top-left corner point (x, y) and by its width and its height. + * @class Rectangle + * @constructor + * @param x {Number} position of the rectangle + * @param y {Number} position of the rectangle + * @param width {Number} of the rectangle + * @param height {Number} of the rectangle + */ +PIXI.Rectangle = function(x, y, width, height) +{ + /** + * @property x + * @type Number + * @default 0 + */ + this.x = x || 0; + + /** + * @property y + * @type Number + * @default 0 + */ + this.y = y || 0; + + /** + * @property width + * @type Number + * @default 0 + */ + this.width = width || 0; + + /** + * @property height + * @type Number + * @default 0 + */ + this.height = height || 0; +} + +/** + * @method clone + * @return a copy of the rectangle + */ +PIXI.Rectangle.prototype.clone = function() +{ + return new PIXI.Rectangle(this.x, this.y, this.width, this.height); +} + +// constructor +PIXI.Rectangle.constructor = PIXI.Rectangle; + + +/** + * @author Adrien Brault + */ + +/** + * @class Polygon + * @constructor + * @param points {Array} + */ +PIXI.Polygon = function(points) +{ + this.points = points; +} + +/** + * @method clone + * @return a copy of the polygon + */ +PIXI.Polygon.clone = function() +{ + var points = []; + for (var i=0; i= 0 && index <= this.children.length) + { + if(child.parent != undefined) + { + child.parent.removeChild(child); + } + + if (index == this.children.length) + { + this.children.push(child); + } + else + { + this.children.splice(index, 0, child); + } + + child.parent = this; + child.childIndex = index; + + var length = this.children.length; + for (var i=index; i < length; i++) + { + this.children[i].childIndex = i; + } + + 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); + } + } + else + { + // error! + + throw new Error(child + " The index "+ index +" supplied is out of bounds " + this.children.length); + } +} + +/** + * Swaps the depth of 2 displayObjects + * @method swapChildren + * @param DisplayObject {DisplayObject} + * @param DisplayObject2 {DisplayObject} + */ +PIXI.DisplayObjectContainer.prototype.swapChildren = function(child, child2) +{ + // TODO I already know this?? + var index = this.children.indexOf( child ); + var index2 = this.children.indexOf( child2 ); + + if ( index !== -1 && index2 !== -1 ) + { + // cool + if(this.stage) + { + // this is to satisfy the webGL batching.. + // TODO sure there is a nicer way to achieve this! + this.stage.__removeChild(child); + this.stage.__removeChild(child2); + + this.stage.__addChild(child); + this.stage.__addChild(child2); + } + + // swap the indexes.. + child.childIndex = index2; + child2.childIndex = index; + // swap the positions.. + this.children[index] = child2; + this.children[index2] = child; + + } + else + { + throw new Error(child + " Both the supplied DisplayObjects must be a child of the caller " + this); + } +} + +/** + * Returns the Child at the specified index + * @method getChildAt + * @param index {Number} + */ +PIXI.DisplayObjectContainer.prototype.getChildAt = function(index) +{ + if(index >= 0 && index < this.children.length) + { + return this.children[index]; + } + else + { + throw new Error(child + " Both the supplied DisplayObjects must be a child of the caller " + this); + + } +} + +/** + * Removes a child from the container. + * @method removeChild + * @param DisplayObject {DisplayObject} + */ +PIXI.DisplayObjectContainer.prototype.removeChild = function(child) +{ + var index = this.children.indexOf( child ); + + if ( index !== -1 ) + { + if(this.stage) + { + this.stage.__removeChild(child); + } + + // webGL trim + if(child.__renderGroup) + { + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) + child.parent = undefined; + + this.children.splice( index, 1 ); + + // update in dexs! + for(var i=index,j=this.children.length; i= this.textures.length) + { + this.gotoAndStop(this.textures.length - 1); + if(this.onComplete) + { + this.onComplete(); + } + } +} +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + +/** + * A Text Object will create a line(s) of text to split a line you can use "\n" + * @class Text + * @extends Sprite + * @constructor + * @param {String} text The copy that you would like the text to display + * @param {Object} [style] The style parameters + * @param {String} [style.font] default "bold 20pt Arial" The style and size of the font + * @param {Object} [style.fill="black"] A canvas fillstyle that will be used on the text eg "red", "#00FF00" + * @param {String} [style.align="left"] An alignment of the multiline text ("left", "center" or "right") + * @param {String} [style.stroke] A canvas fillstyle that will be used on the text stroke eg "blue", "#FCFF00" + * @param {Number} [style.strokeThickness=0] A number that represents the thickness of the stroke. Default is 0 (no stroke) + * @param {Boolean} [style.wordWrap=false] Indicates if word wrap should be used + * @param {Number} [style.wordWrapWidth=100] The width at which text will wrap + */ +PIXI.Text = function(text, style) +{ + this.canvas = document.createElement("canvas"); + this.context = this.canvas.getContext("2d"); + PIXI.Sprite.call(this, PIXI.Texture.fromCanvas(this.canvas)); + + this.setText(text); + this.setStyle(style); + + this.updateText(); + this.dirty = false; +}; + +// constructor +PIXI.Text.constructor = PIXI.Text; +PIXI.Text.prototype = Object.create(PIXI.Sprite.prototype); + +/** + * Set the style of the text + * @method setStyle + * @param {Object} [style] The style parameters + * @param {String} [style.font="bold 20pt Arial"] The style and size of the font + * @param {Object} [style.fill="black"] A canvas fillstyle that will be used on the text eg "red", "#00FF00" + * @param {String} [style.align="left"] An alignment of the multiline text ("left", "center" or "right") + * @param {String} [style.stroke="black"] A canvas fillstyle that will be used on the text stroke eg "blue", "#FCFF00" + * @param {Number} [style.strokeThickness=0] A number that represents the thickness of the stroke. Default is 0 (no stroke) + * @param {Boolean} [style.wordWrap=false] Indicates if word wrap should be used + * @param {Number} [style.wordWrapWidth=100] The width at which text will wrap + */ +PIXI.Text.prototype.setStyle = function(style) +{ + style = style || {}; + style.font = style.font || "bold 20pt Arial"; + style.fill = style.fill || "black"; + style.align = style.align || "left"; + style.stroke = style.stroke || "black"; //provide a default, see: https://github.com/GoodBoyDigital/pixi.js/issues/136 + style.strokeThickness = style.strokeThickness || 0; + style.wordWrap = style.wordWrap || false; + style.wordWrapWidth = style.wordWrapWidth || 100; + this.style = style; + this.dirty = true; +}; + +/** + * Set the copy for the text object. To split a line you can use "\n" + * @methos setText + * @param {String} text The copy that you would like the text to display + */ +PIXI.Sprite.prototype.setText = function(text) +{ + this.text = text.toString() || " "; + this.dirty = true; +}; + +/** + * Renders text + * @private + */ +PIXI.Text.prototype.updateText = function() +{ + this.context.font = this.style.font; + + var outputText = this.text; + + // word wrap + // preserve original text + if(this.style.wordWrap)outputText = this.wordWrap(this.text); + + //split text into lines + var lines = outputText.split(/(?:\r\n|\r|\n)/); + + //calculate text width + var lineWidths = []; + var maxLineWidth = 0; + for (var i = 0; i < lines.length; i++) + { + var lineWidth = this.context.measureText(lines[i]).width; + lineWidths[i] = lineWidth; + maxLineWidth = Math.max(maxLineWidth, lineWidth); + } + this.canvas.width = maxLineWidth + this.style.strokeThickness; + + //calculate text height + var lineHeight = this.determineFontHeight("font: " + this.style.font + ";") + this.style.strokeThickness; + this.canvas.height = lineHeight * lines.length; + + //set canvas text styles + 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"; + + //draw lines line by line + for (i = 0; i < lines.length; i++) + { + var linePosition = new PIXI.Point(this.style.strokeThickness / 2, this.style.strokeThickness / 2 + i * lineHeight); + + if(this.style.align == "right") + { + linePosition.x += maxLineWidth - lineWidths[i]; + } + else if(this.style.align == "center") + { + linePosition.x += (maxLineWidth - lineWidths[i]) / 2; + } + + if(this.style.stroke && this.style.strokeThickness) + { + this.context.strokeText(lines[i], linePosition.x, linePosition.y); + } + + if(this.style.fill) + { + this.context.fillText(lines[i], linePosition.x, linePosition.y); + } + } + + this.updateTexture(); +}; + +/** + * Updates texture size based on canvas size + * @private + */ +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; + + this._width = this.canvas.width; + this._height = this.canvas.height; + + PIXI.texturesToUpdate.push(this.texture.baseTexture); +}; + +/** + * @private + */ +PIXI.Text.prototype.updateTransform = function() +{ + if(this.dirty) + { + this.updateText(); + this.dirty = false; + } + + PIXI.Sprite.prototype.updateTransform.call(this); +}; + +/* + * http://stackoverflow.com/users/34441/ellisbben + * great solution to the problem! + */ +PIXI.Text.prototype.determineFontHeight = function(fontStyle) +{ + // build a little reference dictionary so if the font style has been used return a + // cached version... + var result = PIXI.Text.heightCache[fontStyle]; + + if(!result) + { + var body = document.getElementsByTagName("body")[0]; + var dummy = document.createElement("div"); + var dummyText = document.createTextNode("M"); + dummy.appendChild(dummyText); + dummy.setAttribute("style", fontStyle + ';position:absolute;top:0;left:0'); + body.appendChild(dummy); + + result = dummy.offsetHeight; + PIXI.Text.heightCache[fontStyle] = result; + + body.removeChild(dummy); + } + + return result; +}; + +/** + * A Text Object will apply wordwrap + * @private + */ +PIXI.Text.prototype.wordWrap = function(text) +{ + // search good wrap position + var searchWrapPos = function(ctx, text, start, end, wrapWidth) + { + var p = Math.floor((end-start) / 2) + start; + if(p == start) { + return 1; + } + + if(ctx.measureText(text.substring(0,p)).width <= wrapWidth) + { + if(ctx.measureText(text.substring(0,p+1)).width > wrapWidth) + { + return p; + } + else + { + return arguments.callee(ctx, text, p, end, wrapWidth); + } + } + else + { + return arguments.callee(ctx, text, start, p, wrapWidth); + } + }; + + var lineWrap = function(ctx, text, wrapWidth) + { + if(ctx.measureText(text).width <= wrapWidth || text.length < 1) + { + return text; + } + var pos = searchWrapPos(ctx, text, 0, text.length, wrapWidth); + return text.substring(0, pos) + "\n" + arguments.callee(ctx, text.substring(pos), wrapWidth); + }; + + var result = ""; + var lines = text.split("\n"); + for (var i = 0; i < lines.length; i++) + { + result += lineWrap(this.context, lines[i], this.style.wordWrapWidth) + "\n"; + } + + return result; +}; + +PIXI.Text.prototype.destroy = function(destroyTexture) +{ + if(destroyTexture) + { + this.texture.destroy(); + } + +}; + +PIXI.Text.heightCache = {}; + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + +/** + * A Text Object will create a line(s) of text using bitmap font. To split a line you can use "\n", "\r" or "\r\n" + * You can generate the fnt files using + * http://www.angelcode.com/products/bmfont/ for windows or + * http://www.bmglyph.com/ for mac. + * @class BitmapText + * @extends DisplayObjectContainer + * @constructor + * @param {String} text The copy that you would like the text to display + * @param {Object} style The style parameters + * @param {String} style.font The size (optional) and bitmap font id (required) eq "Arial" or "20px Arial" (must have loaded previously) + * @param {String} [style.align="left"] An alignment of the multiline text ("left", "center" or "right") + */ +PIXI.BitmapText = function(text, style) +{ + PIXI.DisplayObjectContainer.call(this); + + this.setText(text); + this.setStyle(style); + this.updateText(); + this.dirty = false + +}; + +// constructor +PIXI.BitmapText.constructor = PIXI.BitmapText; +PIXI.BitmapText.prototype = Object.create(PIXI.DisplayObjectContainer.prototype); + +/** + * Set the copy for the text object + * @method setText + * @param {String} text The copy that you would like the text to display + */ +PIXI.BitmapText.prototype.setText = function(text) +{ + this.text = text || " "; + this.dirty = true; +}; + +/** + * Set the style of the text + * @method setStyle + * @param {Object} style The style parameters + * @param {String} style.font The size (optional) and bitmap font id (required) eq "Arial" or "20px Arial" (must have loaded previously) + * @param {String} [style.align="left"] An alignment of the multiline text ("left", "center" or "right") + */ +PIXI.BitmapText.prototype.setStyle = function(style) +{ + style = style || {}; + style.align = style.align || "left"; + this.style = style; + + var font = style.font.split(" "); + this.fontName = font[font.length - 1]; + this.fontSize = font.length >= 2 ? parseInt(font[font.length - 2], 10) : PIXI.BitmapText.fonts[this.fontName].size; + + this.dirty = true; +}; + +/** + * Renders text + * @private + */ +PIXI.BitmapText.prototype.updateText = function() +{ + var data = PIXI.BitmapText.fonts[this.fontName]; + var pos = new PIXI.Point(); + var prevCharCode = null; + var chars = []; + var maxLineWidth = 0; + var lineWidths = []; + var line = 0; + var scale = this.fontSize / data.size; + for(var i = 0; i < this.text.length; i++) + { + var charCode = this.text.charCodeAt(i); + if(/(?:\r\n|\r|\n)/.test(this.text.charAt(i))) + { + lineWidths.push(pos.x); + maxLineWidth = Math.max(maxLineWidth, pos.x); + line++; + + pos.x = 0; + pos.y += data.lineHeight; + prevCharCode = null; + continue; + } + + var charData = data.chars[charCode]; + if(!charData) continue; + + if(prevCharCode && charData[prevCharCode]) + { + pos.x += charData.kerning[prevCharCode]; + } + chars.push({texture:charData.texture, line: line, charCode: charCode, position: new PIXI.Point(pos.x + charData.xOffset, pos.y + charData.yOffset)}); + pos.x += charData.xAdvance; + + prevCharCode = charCode; + } + + lineWidths.push(pos.x); + maxLineWidth = Math.max(maxLineWidth, pos.x); + + var lineAlignOffsets = []; + for(i = 0; i <= line; i++) + { + var alignOffset = 0; + if(this.style.align == "right") + { + alignOffset = maxLineWidth - lineWidths[i]; + } + else if(this.style.align == "center") + { + alignOffset = (maxLineWidth - lineWidths[i]) / 2; + } + lineAlignOffsets.push(alignOffset); + } + + for(i = 0; i < chars.length; i++) + { + var c = new PIXI.Sprite(chars[i].texture)//PIXI.Sprite.fromFrame(chars[i].charCode); + c.position.x = (chars[i].position.x + lineAlignOffsets[chars[i].line]) * scale; + c.position.y = chars[i].position.y * scale; + c.scale.x = c.scale.y = scale; + this.addChild(c); + } + + this.width = pos.x * scale; + this.height = (pos.y + data.lineHeight) * scale; +}; + +/** + * @private + */ +PIXI.BitmapText.prototype.updateTransform = function() +{ + if(this.dirty) + { + while(this.children.length > 0) + { + this.removeChild(this.getChildAt(0)); + } + this.updateText(); + + this.dirty = false; + } + + PIXI.DisplayObjectContainer.prototype.updateTransform.call(this); +}; + +PIXI.BitmapText.fonts = {}; +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + +/** +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive +This manager also supports multitouch. +@class InteractionManager +@constructor +@param stage {Stage} +@type Stage +*/ +PIXI.InteractionManager = function(stage) +{ + /** + * a refference to the stage + * @property stage + * @type Stage + */ + this.stage = stage; + + // helpers + this.tempPoint = new PIXI.Point(); + //this.tempMatrix = mat3.create(); + + this.mouseoverEnabled = true; + + /** + * the mouse data + * @property mouse + * @type InteractionData + */ + this.mouse = new PIXI.InteractionData(); + + /** + * an object that stores current touches (InteractionData) by id reference + * @property touchs + * @type Object + */ + this.touchs = {}; + + //tiny little interactiveData pool! + this.pool = []; + + this.interactiveItems = []; + + this.last = 0; +} + +// constructor +PIXI.InteractionManager.constructor = PIXI.InteractionManager; + +PIXI.InteractionManager.prototype.collectInteractiveSprite = function(displayObject, iParent) +{ + var children = displayObject.children; + var length = children.length; + + //this.interactiveItems = []; + /// make an interaction tree... {item.__interactiveParent} + for (var i = length-1; i >= 0; i--) + { + var child = children[i]; + + if(child.visible) { + // push all interactive bits + if(child.interactive) + { + iParent.interactiveChildren = true; + //child.__iParent = iParent; + this.interactiveItems.push(child); + + if(child.children.length > 0) + { + this.collectInteractiveSprite(child, child); + } + } + else + { + child.__iParent = null; + + if(child.children.length > 0) + { + this.collectInteractiveSprite(child, iParent); + } + } + } + } +} + +PIXI.InteractionManager.prototype.setTarget = function(target) +{ + if (window.navigator.msPointerEnabled) + { + // time to remove some of that zoom in ja.. + target.view.style["-ms-content-zooming"] = "none"; + target.view.style["-ms-touch-action"] = "none" + + // DO some window specific touch! + } + + this.target = target; + target.view.addEventListener('mousemove', this.onMouseMove.bind(this), true); + target.view.addEventListener('mousedown', this.onMouseDown.bind(this), true); + document.body.addEventListener('mouseup', this.onMouseUp.bind(this), true); + target.view.addEventListener('mouseout', this.onMouseUp.bind(this), true); + + // aint no multi touch just yet! + target.view.addEventListener("touchstart", this.onTouchStart.bind(this), true); + target.view.addEventListener("touchend", this.onTouchEnd.bind(this), true); + target.view.addEventListener("touchmove", this.onTouchMove.bind(this), true); +} + +PIXI.InteractionManager.prototype.update = function() +{ + if(!this.target)return; + + // frequency of 30fps?? + var now = Date.now(); + var diff = now - this.last; + diff = (diff * 30) / 1000; + if(diff < 1)return; + this.last = now; + // + + // ok.. so mouse events?? + // yes for now :) + // OPTIMSE - how often to check?? + if(this.dirty) + { + this.dirty = false; + + var len = this.interactiveItems.length; + + for (var i=0; i < len; i++) { + this.interactiveItems[i].interactiveChildren = false; + } + + this.interactiveItems = []; + + if(this.stage.interactive)this.interactiveItems.push(this.stage); + // go through and collect all the objects that are interactive.. + this.collectInteractiveSprite(this.stage, this.stage); + } + + // loop through interactive objects! + var length = this.interactiveItems.length; + + this.target.view.style.cursor = "default"; + + for (var i = 0; i < length; i++) + { + var item = this.interactiveItems[i]; + if(!item.visible)continue; + + // OPTIMISATION - only calculate every time if the mousemove function exists.. + // OK so.. does the object have any other interactive functions? + // hit-test the clip! + + + if(item.mouseover || item.mouseout || item.buttonMode) + { + // ok so there are some functions so lets hit test it.. + item.__hit = this.hitTest(item, this.mouse); + // ok so deal with interactions.. + // loks like there was a hit! + if(item.__hit) + { + if(item.buttonMode)this.target.view.style.cursor = "pointer"; + + if(!item.__isOver) + { + + if(item.mouseover)item.mouseover(this.mouse); + item.__isOver = true; + } + } + else + { + if(item.__isOver) + { + // roll out! + if(item.mouseout)item.mouseout(this.mouse); + item.__isOver = false; + } + } + } + + // ---> + } +} + +PIXI.InteractionManager.prototype.onMouseMove = function(event) +{ + // TODO optimize by not check EVERY TIME! maybe half as often? // + var rect = this.target.view.getBoundingClientRect(); + + this.mouse.global.x = (event.clientX - rect.left) * (this.target.width / rect.width); + this.mouse.global.y = (event.clientY - rect.top) * ( this.target.height / rect.height); + + var length = this.interactiveItems.length; + var global = this.mouse.global; + + + for (var i = 0; i < length; i++) + { + var item = this.interactiveItems[i]; + + if(item.mousemove) + { + //call the function! + item.mousemove(this.mouse); + } + } +} + +PIXI.InteractionManager.prototype.onMouseDown = function(event) +{ + event.preventDefault(); + + // loop through inteaction tree... + // hit test each item! -> + // get interactive items under point?? + //stage.__i + var length = this.interactiveItems.length; + var global = this.mouse.global; + + var index = 0; + var parent = this.stage; + + // while + // hit test + for (var i = 0; i < length; i++) + { + var item = this.interactiveItems[i]; + + if(item.mousedown || item.click) + { + item.__mouseIsDown = true; + item.__hit = this.hitTest(item, this.mouse); + + if(item.__hit) + { + //call the function! + if(item.mousedown)item.mousedown(this.mouse); + item.__isDown = true; + + // just the one! + if(!item.interactiveChildren)break; + } + } + } +} + +PIXI.InteractionManager.prototype.onMouseUp = function(event) +{ + + + var global = this.mouse.global; + + + var length = this.interactiveItems.length; + var up = false; + + for (var i = 0; i < length; i++) + { + var item = this.interactiveItems[i]; + + if(item.mouseup || item.mouseupoutside || item.click) + { + item.__hit = this.hitTest(item, this.mouse); + + if(item.__hit && !up) + { + //call the function! + if(item.mouseup) + { + item.mouseup(this.mouse); + } + if(item.__isDown) + { + if(item.click)item.click(this.mouse); + } + + if(!item.interactiveChildren)up = true; + } + else + { + if(item.__isDown) + { + if(item.mouseupoutside)item.mouseupoutside(this.mouse); + } + } + + item.__isDown = false; + } + } +} + +PIXI.InteractionManager.prototype.hitTest = function(item, interactionData) +{ + var global = interactionData.global; + + if(!item.visible)return false; + + var isSprite = (item instanceof PIXI.Sprite), + worldTransform = item.worldTransform, + a00 = worldTransform[0], a01 = worldTransform[1], a02 = worldTransform[2], + a10 = worldTransform[3], a11 = worldTransform[4], a12 = worldTransform[5], + id = 1 / (a00 * a11 + a01 * -a10), + x = a11 * id * global.x + -a01 * id * global.y + (a12 * a01 - a02 * a11) * id, + y = a00 * id * global.y + -a10 * id * global.x + (-a12 * a00 + a02 * a10) * id; + + //a sprite or display object with a hit area defined + if(item.hitArea) + { + var hitArea = item.hitArea; + + //Polygon hit area + if(item.hitArea instanceof PIXI.Polygon) { + var inside = false; + + // use some raycasting to test hits + // https://github.com/substack/point-in-polygon/blob/master/index.js + for(var i = 0, j = item.hitArea.points.length - 1; i < item.hitArea.points.length; j = i++) { + var xi = item.hitArea.points[i].x, yi = item.hitArea.points[i].y, + xj = item.hitArea.points[j].x, yj = item.hitArea.points[j].y, + intersect = ((yi > y) != (yj > y)) && (x < (xj - xi) * (y - yi) / (yj - yi) + xi); + + if(intersect) inside = !inside; + } + + if(inside) { + if(isSprite) interactionData.target = item; + return true; + } + } + //Rectangle hit area + else { + var x1 = hitArea.x; + if(x > x1 && x < x1 + hitArea.width) + { + var y1 = hitArea.y; + + if(y > y1 && y < y1 + hitArea.height) + { + if(isSprite) interactionData.target = item; + return true; + } + } + } + } + // a sprite with no hitarea defined + else if(isSprite) + { + var width = item.texture.frame.width, + height = item.texture.frame.height, + x1 = -width * item.anchor.x, + y1; + + if(x > x1 && x < x1 + width) + { + y1 = -height * item.anchor.y; + + if(y > y1 && y < y1 + height) + { + // set the target property if a hit is true! + interactionData.target = item + return true; + } + } + } + + var length = item.children.length; + + for (var i = 0; i < length; i++) + { + var tempItem = item.children[i]; + var hit = this.hitTest(tempItem, interactionData); + if(hit)return true; + } + + return false; +} + + + +PIXI.InteractionManager.prototype.onTouchMove = function(event) +{ + var rect = this.target.view.getBoundingClientRect(); + var changedTouches = event.changedTouches; + + for (var i=0; i < changedTouches.length; i++) + { + var touchEvent = changedTouches[i]; + var touchData = this.touchs[touchEvent.identifier]; + + // update the touch position + touchData.global.x = (touchEvent.clientX - rect.left) * (this.target.width / rect.width); + touchData.global.y = (touchEvent.clientY - rect.top) * (this.target.height / rect.height); + } + + var length = this.interactiveItems.length; + for (var i = 0; i < length; i++) + { + var item = this.interactiveItems[i]; + if(item.touchmove)item.touchmove(touchData); + } +} + +PIXI.InteractionManager.prototype.onTouchStart = function(event) +{ + event.preventDefault(); + + var rect = this.target.view.getBoundingClientRect(); + + var changedTouches = event.changedTouches; + for (var i=0; i < changedTouches.length; i++) + { + var touchEvent = changedTouches[i]; + + var touchData = this.pool.pop(); + if(!touchData)touchData = new PIXI.InteractionData(); + + this.touchs[touchEvent.identifier] = touchData; + touchData.global.x = (touchEvent.clientX - rect.left) * (this.target.width / rect.width); + touchData.global.y = (touchEvent.clientY - rect.top) * (this.target.height / rect.height); + + var length = this.interactiveItems.length; + + for (var j = 0; j < length; j++) + { + var item = this.interactiveItems[j]; + + if(item.touchstart || item.tap) + { + item.__hit = this.hitTest(item, touchData); + + if(item.__hit) + { + //call the function! + if(item.touchstart)item.touchstart(touchData); + item.__isDown = true; + item.__touchData = touchData; + + if(!item.interactiveChildren)break; + } + } + } + } + +} + +PIXI.InteractionManager.prototype.onTouchEnd = function(event) +{ + var rect = this.target.view.getBoundingClientRect(); + var changedTouches = event.changedTouches; + + for (var i=0; i < changedTouches.length; i++) + { + + var touchEvent = changedTouches[i]; + var touchData = this.touchs[touchEvent.identifier]; + var up = false; + touchData.global.x = (touchEvent.clientX - rect.left) * (this.target.width / rect.width); + touchData.global.y = (touchEvent.clientY - rect.top) * (this.target.height / rect.height); + + var length = this.interactiveItems.length; + for (var j = 0; j < length; j++) + { + var item = this.interactiveItems[j]; + var itemTouchData = item.__touchData; // <-- Here! + item.__hit = this.hitTest(item, touchData); + + if(itemTouchData == touchData) + { + // so this one WAS down... + + // hitTest?? + + if(item.touchend || item.tap) + { + if(item.__hit && !up) + { + if(item.touchend)item.touchend(touchData); + if(item.__isDown) + { + if(item.tap)item.tap(touchData); + } + + if(!item.interactiveChildren)up = true; + } + else + { + if(item.__isDown) + { + if(item.touchendoutside)item.touchendoutside(touchData); + } + } + + item.__isDown = false; + } + + item.__touchData = null; + + } + else + { + + } + } + // remove the touch.. + this.pool.push(touchData); + this.touchs[touchEvent.identifier] = null; + } +} + +/** +@class InteractionData +@constructor +*/ +PIXI.InteractionData = function() +{ + /** + * This point stores the global coords of where the touch/mouse event happened + * @property global + * @type Point + */ + this.global = new PIXI.Point(); + + // this is here for legacy... but will remove + this.local = new PIXI.Point(); + + /** + * The target Sprite that was interacted with + * @property target + * @type Sprite + */ + this.target; +} + +/** + * This will return the local coords of the specified displayObject for this InteractionData + * @method getLocalPosition + * @param displayObject {DisplayObject} The DisplayObject that you would like the local coords off + * @return {Point} A point containing the coords of the InteractionData position relative to the DisplayObject + */ +PIXI.InteractionData.prototype.getLocalPosition = function(displayObject) +{ + var worldTransform = displayObject.worldTransform; + var global = this.global; + + // do a cheeky transform to get the mouse coords; + var a00 = worldTransform[0], a01 = worldTransform[1], a02 = worldTransform[2], + a10 = worldTransform[3], a11 = worldTransform[4], a12 = worldTransform[5], + id = 1 / (a00 * a11 + a01 * -a10); + // set the mouse coords... + return new PIXI.Point(a11 * id * global.x + -a01 * id * global.y + (a12 * a01 - a02 * a11) * id, + a00 * id * global.y + -a10 * id * global.x + (-a12 * a00 + a02 * a10) * id) +} + +// constructor +PIXI.InteractionData.constructor = PIXI.InteractionData; + + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + +/** +A Stage represents the root of the display tree. Everything connected to the stage is rendered +@class Stage +@extends DisplayObjectContainer +@constructor +@param backgroundColor {Number} the background color of the stage +@param interactive {Boolean} enable / disable interaction (default is false) +*/ +PIXI.Stage = function(backgroundColor, interactive) +{ + + 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,100000, 100000); + + // interaction! + this.interactive = !!interactive; + this.interactionManager = new PIXI.InteractionManager(this); + + this.setBackgroundColor(backgroundColor); + this.worldVisible = true; + + this.stage.dirty = true; +} + +// constructor +PIXI.Stage.constructor = PIXI.Stage; + +PIXI.Stage.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); + +/** +@method updateTransform +@internal +*/ +PIXI.Stage.prototype.updateTransform = function() +{ + this.worldAlpha = 1; + + for(var i=0,j=this.children.length; i> 16 & 0xFF) / 255, ( hex >> 8 & 0xFF) / 255, (hex & 0xFF)/ 255]; +} + +/** + * Provides bind in a cross browser way. + */ +if (typeof Function.prototype.bind != 'function') { + Function.prototype.bind = (function () { + var slice = Array.prototype.slice; + return function (thisArg) { + var target = this, boundArgs = slice.call(arguments, 1); + + if (typeof target != 'function') throw new TypeError(); + + function bound() { + var args = boundArgs.concat(slice.call(arguments)); + target.apply(this instanceof bound ? this : thisArg, args); + } + + bound.prototype = (function F(proto) { + proto && (F.prototype = proto); + if (!(this instanceof F)) return new F; + })(target.prototype); + + return bound; + }; + })(); +} + +var AjaxRequest = PIXI.AjaxRequest = function() +{ + var activexmodes = ["Msxml2.XMLHTTP", "Microsoft.XMLHTTP"] //activeX versions to check for in IE + + if (window.ActiveXObject) + { //Test for support for ActiveXObject in IE first (as XMLHttpRequest in IE7 is broken) + for (var i=0; i 0) + { + PIXI.WebGLGraphics.buildLine(data, graphics._webGL); + } + } + else if(data.type == PIXI.Graphics.RECT) + { + PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); + } + else if(data.type == PIXI.Graphics.CIRC) + { + PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); + } + }; + + //console.log(graphics._webGL.lastIndex - graphics.graphicsData.length ) + graphics._webGL.lastIndex = graphics.graphicsData.length; + + // convert to points + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); + + var gl = PIXI.gl; + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); + gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); +} + + +PIXI.WebGLGraphics.buildRectangle = function(graphicsData, webGLData) +{ + // --- // + // need to convert points to a nice regular data + // + var rectData = graphicsData.points; + var x = rectData[0]; + var y = rectData[1]; + var width = rectData[2]; + var height = rectData[3]; + + + if(graphicsData.fill) + { + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var verts = webGLData.points; + + // dead triangle + verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); + verts.push(x, y, 1, 1, 1, 1); + + // start + verts.push(x, y); + verts.push(r, g, b, alpha); + + verts.push(x + width, y); + verts.push(r, g, b, alpha); + + verts.push(x , y + height); + verts.push(r, g, b, alpha); + + verts.push(x + width, y + height); + verts.push(r, g, b, alpha); + + webGLData.lastPosition.x = x + width; + webGLData.lastPosition.y = y + height; + } + + if(graphicsData.lineWidth) + { + graphicsData.points = [x, y, + x + width, y, + x + width, y + height, + x, y + height, + x, y]; + + PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); + } + +} + +PIXI.WebGLGraphics.buildCircle = function(graphicsData, webGLData) +{ + // --- // + // need to convert points to a nice regular data + // + var rectData = graphicsData.points; + var x = rectData[0]; + var y = rectData[1]; + var radius = rectData[2]; + + var totalSegs = 40; + var seg = (Math.PI * 2) / totalSegs ; + + if(graphicsData.fill) + { + var color = HEXtoRGB(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + var verts = webGLData.points; + + verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); + verts.push(x, y, 1, 1, 1, 1); + + for (var i=0; i < totalSegs + 1 ; i++) + { + verts.push(x,y); + verts.push(r, g, b, alpha); + + verts.push(x + Math.sin(seg * i) * radius, + y + Math.cos(seg * i) * radius); + + verts.push(r, g, b, alpha); + }; + + verts.push(x,y); + verts.push(1, 0, 0, 1); + + webGLData.lastPosition.x = x; + webGLData.lastPosition.y = y; + } + + if(graphicsData.lineWidth) + { + graphicsData.points = []; + + for (var i=0; i < totalSegs + 1; i++) + { + graphicsData.points.push(x + Math.sin(seg * i) * radius, + y + Math.cos(seg * i) * radius) + }; + + PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); + } + +} + +PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) +{ + // TODO OPTIMISE! + + var wrap = true; + var points = graphicsData.points; + if(points.length == 0)return; + + // get first and last point.. figure out the middle! + var firstPoint = new PIXI.Point( points[0], points[1] ); + var lastPoint = new PIXI.Point( points[points.length - 2], points[points.length - 1] ); + + // if the first point is the last point - goona have issues :) + if(firstPoint.x == lastPoint.x && firstPoint.y == lastPoint.y) + { + points.pop(); + points.pop(); + + lastPoint = new PIXI.Point( points[points.length - 2], points[points.length - 1] ); + + var midPointX = lastPoint.x + (firstPoint.x - lastPoint.x) *0.5; + var midPointY = lastPoint.y + (firstPoint.y - lastPoint.y) *0.5; + + points.unshift(midPointX, midPointY); + points.push(midPointX, midPointY) + } + + var verts = webGLData.points; + + var length = points.length / 2; + + // DRAW the Line + var width = graphicsData.lineWidth / 2; + + // sort color + var color = HEXtoRGB(graphicsData.lineColor); + var alpha = graphicsData.lineAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; + + // i = 0 // + var point1 = new PIXI.Point( points[0], points[1] ); + var point2 = new PIXI.Point( points[2], points[3] ); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); + var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); + + perp.x /= dist; + perp.y /= dist; + perp.x *= width; + perp.y *= width; + + // insert dead triangle as we are using a triangle strip + verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1); + verts.push(points[0] - perp.x , points[1] - perp.y, 1, 1, 1, 1); + + // start + + verts.push(points[0] - perp.x , points[1] - perp.y); + verts.push(r, g, b, alpha); + + verts.push(points[0] + perp.x , points[1] + perp.y); + verts.push(r, g, b, alpha); + + for (var i = 1; i < length-1; i++) + { + var point1 = new PIXI.Point( points[(i-1)*2],points[(i-1)*2 + 1] ); + var point2 = new PIXI.Point(points[(i)*2],points[(i)*2 + 1] ); + var point3 = new PIXI.Point(points[(i+1)*2],points[(i+1)*2 + 1] ); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); + var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); + perp.x /= dist; + perp.y /= dist; + perp.x *= width; + perp.y *= width; + + var perp2 = new PIXI.Point(-(point2.y - point3.y), point2.x - point3.x); + var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y); + perp2.x /= dist2; + perp2.y /= dist2; + perp2.x *= width; + perp2.y *= width; + + var A = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y); + var B = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y); + + var E = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y ); + var F = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y ); + + var a1 = B.y-A.y; + var b1 = A.x-B.x; + var c1 = B.x*A.y - A.x*B.y; + var a2 = F.y-E.y; + var b2 = E.x-F.x; + var c2 = F.x*E.y - E.x*F.y; + + var denom = a1*b2 - a2*b1; + + if (denom == 0) { + denom+=1; + } + + var p = new PIXI.Point(); + + p.x = (b1*c2 - b2*c1)/denom; + p.y = (a2*c1 - a1*c2)/denom; + + + var pdist = (p.x -point2.x) * (p.x -point2.x) + (p.y -point2.y) + (p.y -point2.y); + + if(pdist > 140 * 140) + { + var perp3 = new PIXI.Point(perp.x - perp2.x, perp.y - perp2.y); + var dist3 = Math.sqrt(perp3.x*perp3.x + perp3.y*perp3.y); + perp3.x /= dist3; + perp3.y /= dist3; + perp3.x *= width; + perp3.y *= width; + + verts.push(point2.x - perp3.x, point2.y -perp3.y); + verts.push(r, g, b, alpha); + + verts.push(point2.x + perp3.x, point2.y +perp3.y); + verts.push(r, g, b, alpha); + + verts.push(point2.x - perp3.x, point2.y -perp3.y); + verts.push(r, g, b, alpha); + } + else + { + verts.push(p.x , p.y); + verts.push(r, g, b, alpha); + + verts.push(point2.x - (p.x-point2.x), point2.y - (p.y - point2.y));//, 4); + verts.push(r, g, b, alpha); + } + } + + var point1 = new PIXI.Point( points[(length-2)*2], points[(length-2)*2 + 1] ); + var point2 = new PIXI.Point( points[(length-1)*2], points[(length-1)*2 + 1] ); + + var perp = new PIXI.Point(-(point1.y - point2.y), point1.x - point2.x); + //getPerp(point1, point2); + var dist = Math.sqrt(perp.x*perp.x + perp.y*perp.y); + perp.x /= dist; + perp.y /= dist; + perp.x *= width; + perp.y *= width; + verts.push(point2.x - perp.x , point2.y - perp.y) + verts.push(r, g, b, alpha); + + verts.push(point2.x + perp.x , point2.y + perp.y) + verts.push(r, g, b, alpha); + + // set last triangle! + webGLData.lastPosition.x = point2.x + perp.x; + webGLData.lastPosition.y = point2.y + perp.y; + +} + +function HEXtoRGB(hex) { + return [(hex >> 16 & 0xFF) / 255, ( hex >> 8 & 0xFF) / 255, (hex & 0xFF)/ 255]; +} + + + + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + +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 :) + * @class WebGLRenderer + * @constructor + * @param width {Number} the width of the canvas view + * @default 0 + * @param height {Number} the height of the canvas view + * @default 0 + * @param view {Canvas} the canvas to use as a view, optional + * @param transparent {Boolean} the transparency of the render view, default false + * @default false + * + */ +PIXI.WebGLRenderer = function(width, height, view, transparent) +{ + // do a catch.. only 1 webGL renderer.. + + //console.log(transparent) + this.transparent = !!transparent; + + this.width = width || 800; + this.height = height || 600; + + this.view = view || document.createElement( 'canvas' ); + this.view.width = this.width; + this.view.height = this.height; + + // deal with losing context.. + var scope = this; + this.view.addEventListener('webglcontextlost', function(event) { scope.handleContextLost(event); }, false) + this.view.addEventListener('webglcontextrestored', function(event) { scope.handleContextRestored(event); }, false) + + this.batchs = []; + + try + { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { + alpha: this.transparent, + antialias:false, // SPEED UP?? + premultipliedAlpha:false + }); + } + catch (e) + { + throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); + } + + PIXI.initPrimitiveShader(); + PIXI.initDefaultShader(); + PIXI.initDefaultStripShader(); + + PIXI.activateDefaultShader(); + + 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); + + PIXI.projection = new PIXI.Point(400, 300); + + this.resize(this.width, this.height); + this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); +} + +// constructor +PIXI.WebGLRenderer.constructor = PIXI.WebGLRenderer; + +/** + * @private + */ +PIXI.WebGLRenderer.getBatch = function() +{ + if(PIXI._batchs.length == 0) + { + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); + } + else + { + return PIXI._batchs.pop(); + } +} + +/** + * @private + */ +PIXI.WebGLRenderer.returnBatch = function(batch) +{ + batch.clean(); + PIXI._batchs.push(batch); +} + + +/** + * @private + */ + + + +/** + * Renders the stage to its webGL view + * @method render + * @param stage {Stage} the PIXI.Stage element to be rendered + */ +PIXI.WebGLRenderer.prototype.render = function(stage) +{ + if(this.contextLost)return; + + + // if rendering a new stage clear the batchs.. + if(this.__stage !== stage) + { + // TODO make this work + // dont think this is needed any more? + //if(this.__stage)this.checkVisibility(this.__stage, false) + + this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); + } + + // TODO not needed now... + // update children if need be + // best to remove first! + /*for (var i=0; i < stage.__childrenRemoved.length; i++) + { + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); + }*/ + + // update any textures + PIXI.WebGLRenderer.updateTextures(); + + // recursivly loop through all items! + //this.checkVisibility(stage, true); + + // update the scene graph + stage.updateTransform(); + + var gl = this.gl; + + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); + + // set the correct matrix.. + // gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], !this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // HACK TO TEST + //PIXI.projectionMatrix = this.projectionMatrix; + + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(PIXI.projection); + + // interaction + // run interaction! + if(stage.interactive) + { + //need to add some events! + if(!stage._interactiveEventsAdded) + { + stage._interactiveEventsAdded = true; + stage.interactionManager.setTarget(this); + } + } + + // after rendering lets confirm all frames that have been uodated.. + if(PIXI.Texture.frameUpdates.length > 0) + { + for (var i=0; i < PIXI.Texture.frameUpdates.length; i++) + { + PIXI.Texture.frameUpdates[i].updateFrame = false; + }; + + PIXI.Texture.frameUpdates = []; + } +} + +/** + * @private + */ + +PIXI.WebGLRenderer.updateTextures = function() +{ + for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); + for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); + PIXI.texturesToUpdate = []; + PIXI.texturesToDestroy = []; +} + +PIXI.WebGLRenderer.updateTexture = function(texture) +{ + var gl = PIXI.gl; + + if(!texture._glTexture) + { + texture._glTexture = gl.createTexture(); + } + + if(texture.hasLoaded) + { + gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); + gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + + // reguler... + + if(!texture._powerOf2) + { + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + } + else + { + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); + } + + gl.bindTexture(gl.TEXTURE_2D, null); + } + +} + +PIXI.WebGLRenderer.prototype.destroyTexture = function(texture) +{ + var gl = this.gl; + + if(texture._glTexture) + { + texture._glTexture = gl.createTexture(); + gl.deleteTexture(gl.TEXTURE_2D, texture._glTexture); + } +} + +/** + * resizes the webGL view to the specified width and height + * @method resize + * @param width {Number} the new width of the webGL view + * @param height {Number} the new height of the webGL view + */ +PIXI.WebGLRenderer.prototype.resize = function(width, height) +{ + this.width = width; + this.height = height; + + this.view.width = width; + this.view.height = height; + + this.gl.viewport(0, 0, this.width, this.height); + + //var projectionMatrix = this.projectionMatrix; + + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; + +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; +} + +/** + * @private + */ +PIXI.WebGLRenderer.prototype.handleContextLost = function(event) +{ + event.preventDefault(); + this.contextLost = true; +} + +/** + * @private + */ +PIXI.WebGLRenderer.prototype.handleContextRestored = function(event) +{ + this.gl = this.view.getContext("experimental-webgl", { + alpha: true + }); + + this.initShaders(); + + for (var i=0; i < PIXI.TextureCache.length; i++) + { + this.updateTexture(PIXI.TextureCache[i]); + }; + + for (var i=0; i < this.batchs.length; i++) + { + this.batchs[i].restoreLostContext(this.gl)// + this.batchs[i].dirty = true; + }; + + PIXI._restoreBatchs(this.gl); + + this.contextLost = false; +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + +PIXI._batchs = []; + +/** + * @private + */ +PIXI._getBatch = function(gl) +{ + if(PIXI._batchs.length == 0) + { + return new PIXI.WebGLBatch(gl); + } + else + { + return PIXI._batchs.pop(); + } +} + +/** + * @private + */ +PIXI._returnBatch = function(batch) +{ + batch.clean(); + PIXI._batchs.push(batch); +} + +/** + * @private + */ +PIXI._restoreBatchs = function(gl) +{ + for (var i=0; i < PIXI._batchs.length; i++) + { + PIXI._batchs[i].restoreLostContext(gl); + }; +} + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLBatch = function(gl) +{ + this.gl = gl; + + this.size = 0; + + this.vertexBuffer = gl.createBuffer(); + this.indexBuffer = gl.createBuffer(); + this.uvBuffer = gl.createBuffer(); + this.colorBuffer = gl.createBuffer(); + this.blendMode = PIXI.blendModes.NORMAL; + this.dynamicSize = 1; +} + + +// constructor +PIXI.WebGLBatch.constructor = PIXI.WebGLBatch; + +/** + * Cleans the batch so that is can be returned to an object pool and reused + */ +PIXI.WebGLBatch.prototype.clean = function() +{ + this.verticies = []; + this.uvs = []; + this.indices = []; + this.colors = []; + //this.sprites = []; + this.dynamicSize = 1; + this.texture = null; + this.last = null; + this.size = 0; + + this.head; + this.tail; +} + +/* + * recreates the buffers in the event of a context loss + */ +PIXI.WebGLBatch.prototype.restoreLostContext = function(gl) +{ + this.gl = gl; + this.vertexBuffer = gl.createBuffer(); + this.indexBuffer = gl.createBuffer(); + this.uvBuffer = gl.createBuffer(); + this.colorBuffer = gl.createBuffer(); +} + +/** + * inits the batch's texture and blend mode based if the supplied sprite + * @method init + * @param sprite {Sprite} the first sprite to be added to the batch. Only sprites with the same base texture and blend mode will be allowed to be added to this batch + */ +PIXI.WebGLBatch.prototype.init = function(sprite) +{ + sprite.batch = this; + this.dirty = true; + this.blendMode = sprite.blendMode; + this.texture = sprite.texture.baseTexture; +// this.sprites.push(sprite); + this.head = sprite; + this.tail = sprite; + this.size = 1; + + this.growBatch(); +} + +/** + * inserts a sprite before the specified sprite + * @method insertBefore + * @param sprite {Sprite} the sprite to be added + * @param nextSprite {nextSprite} the first sprite will be inserted before this sprite + */ +PIXI.WebGLBatch.prototype.insertBefore = function(sprite, nextSprite) +{ + this.size++; + + sprite.batch = this; + this.dirty = true; + var tempPrev = nextSprite.__prev; + nextSprite.__prev = sprite; + sprite.__next = nextSprite; + + if(tempPrev) + { + sprite.__prev = tempPrev; + tempPrev.__next = sprite; + } + else + { + this.head = sprite; + //this.head.__prev = null + } +} + +/** + * inserts a sprite after the specified sprite + * @method insertAfter + * @param sprite {Sprite} the sprite to be added + * @param previousSprite {Sprite} the first sprite will be inserted after this sprite + */ +PIXI.WebGLBatch.prototype.insertAfter = function(sprite, previousSprite) +{ + this.size++; + + + sprite.batch = this; + this.dirty = true; + + var tempNext = previousSprite.__next; + previousSprite.__next = sprite; + sprite.__prev = previousSprite; + + if(tempNext) + { + sprite.__next = tempNext; + tempNext.__prev = sprite; + } + else + { + this.tail = sprite + } + +} + +/** + * removes a sprite from the batch + * @method remove + * @param sprite {Sprite} the sprite to be removed + */ +PIXI.WebGLBatch.prototype.remove = function(sprite) +{ + this.size--; + + if(this.size == 0) + { + sprite.batch = null; + sprite.__prev = null; + sprite.__next = null; + return; + } + + if(sprite.__prev) + { + sprite.__prev.__next = sprite.__next; + } + else + { + this.head = sprite.__next; + this.head.__prev = null; + } + + if(sprite.__next) + { + sprite.__next.__prev = sprite.__prev; + } + else + { + this.tail = sprite.__prev; + this.tail.__next = null + } + + sprite.batch = null; + sprite.__next = null; + sprite.__prev = null; + this.dirty = true; +} + +/** + * Splits the batch into two with the specified sprite being the start of the new batch. + * @method split + * @param sprite {Sprite} the sprite that indicates where the batch should be split + * @return {WebGLBatch} the new batch + */ +PIXI.WebGLBatch.prototype.split = function(sprite) +{ + + //console.log("Splitting batch :" + this.size) +// console.log(sprite) +// console.log("-------") + this.dirty = true; + + //var val = (this.tail == this.head) + //console.log(val + " SAME?"); + var batch = new PIXI.WebGLBatch(this.gl)//PIXI._getBatch(this.gl); + batch.init(sprite); + batch.texture = this.texture; + batch.tail = this.tail; + //console.log("id is " +batcheee.id) + + this.tail = sprite.__prev; + this.tail.__next = null; + + sprite.__prev = null; + // return a splite batch! + //sprite.__prev.__next = null; + //sprite.__prev = null; + + + // TODO this size is wrong! + // need to recalculate :/ problem with a linked list! + // unless it gets calculated in the "clean"? + + // need to loop through items as there is no way to know the length on a linked list :/ + var tempSize = 0; + while(sprite) + { + tempSize++; + sprite.batch = batch; + sprite = sprite.__next; + } + + batch.size = tempSize; + this.size -= tempSize; + + return batch; +} + +/** + * Merges two batchs together + * @method merge + * @param batch {WebGLBatch} the batch that will be merged + */ +PIXI.WebGLBatch.prototype.merge = function(batch) +{ + this.dirty = true; + + this.tail.__next = batch.head; + batch.head.__prev = this.tail; + + this.size += batch.size; + + this.tail = batch.tail; + + var sprite = batch.head; + while(sprite) + { + sprite.batch = this; + sprite = sprite.__next; + } + +} + +/** + * Grows the size of the batch. As the elements in the batch cannot have a dynamic size this function is used to increase the size of the batch. It also creates a little extra room so that the batch does not need to be resized every time a sprite is added + * @methos growBatch + */ +PIXI.WebGLBatch.prototype.growBatch = function() +{ + var gl = this.gl; + if( this.size == 1) + { + this.dynamicSize = 1; + } + else + { + this.dynamicSize = this.size * 1.5 + } + // grow verts + this.verticies = new Float32Array(this.dynamicSize * 8); + + gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); + gl.bufferData(gl.ARRAY_BUFFER,this.verticies , gl.DYNAMIC_DRAW); + + this.uvs = new Float32Array( this.dynamicSize * 8 ) + gl.bindBuffer(gl.ARRAY_BUFFER, this.uvBuffer); + gl.bufferData(gl.ARRAY_BUFFER, this.uvs , gl.DYNAMIC_DRAW); + + this.dirtyUVS = true; + + this.colors = new Float32Array( this.dynamicSize * 4 ) + gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer); + gl.bufferData(gl.ARRAY_BUFFER, this.colors , gl.DYNAMIC_DRAW); + + this.dirtyColors = true; + + this.indices = new Uint16Array(this.dynamicSize * 6); + var length = this.indices.length/6; + + for (var i=0; i < length; i++) + { + var index2 = i * 6; + var index3 = i * 4; + this.indices[index2 + 0] = index3 + 0; + this.indices[index2 + 1] = index3 + 1; + this.indices[index2 + 2] = index3 + 2; + this.indices[index2 + 3] = index3 + 0; + this.indices[index2 + 4] = index3 + 2; + this.indices[index2 + 5] = index3 + 3; + }; + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices, gl.STATIC_DRAW); + +} + +/** + * Refresh's all the data in the batch and sync's it with the webGL buffers + * @method refresh + */ +PIXI.WebGLBatch.prototype.refresh = function() +{ + var gl = this.gl; + + if (this.dynamicSize < this.size) + { + this.growBatch(); + } + + var indexRun = 0; + var worldTransform, width, height, aX, aY, w0, w1, h0, h1, index + var a, b, c, d, tx, ty + + var displayObject = this.head + + while(displayObject) + { + index = indexRun * 8; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + + colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + + displayObject = displayObject.__next; + + indexRun ++; + } + + this.dirtyUVS = true; + this.dirtyColors = true; +} + +/** + * Updates all the relevant geometry and uploads the data to the GPU + * @method update + */ +PIXI.WebGLBatch.prototype.update = function() +{ + var gl = this.gl; + var worldTransform, width, height, aX, aY, w0, w1, h0, h1, index, index2, index3 + + var a, b, c, d, tx, ty; + + var indexRun = 0; + + var displayObject = this.head; + + while(displayObject) + { + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; + + worldTransform = displayObject.worldTransform; + + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; + + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; + + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; + + + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } + + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } + } + else + { + index = indexRun * 8; + + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; + } + + indexRun++; + displayObject = displayObject.__next; + } +} + +/** + * Draws the batch to the frame buffer + * @method render + */ +PIXI.WebGLBatch.prototype.render = function(start, end) +{ +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + + if(this.dirty) + { + this.refresh(); + this.dirty = false; + + } + + if (this.size == 0)return; + + this.update(); + var gl = this.gl; + + //TODO optimize this! + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + + var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); + + // update the verts.. + gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); + // ok.. + gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.verticies) + gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 0, 0); + + // update the uvs + gl.bindBuffer(gl.ARRAY_BUFFER, this.uvBuffer); + + if(this.dirtyUVS) + { + this.dirtyUVS = false; + gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.uvs); + } + + gl.vertexAttribPointer(shaderProgram.textureCoordAttribute, 2, gl.FLOAT, false, 0, 0); + + gl.activeTexture(gl.TEXTURE0); + gl.bindTexture(gl.TEXTURE_2D, this.texture._glTexture); + + // update color! + gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer); + + if(this.dirtyColors) + { + this.dirtyColors = false; + gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.colors); + } + + gl.vertexAttribPointer(shaderProgram.colorAttribute, 1, gl.FLOAT, false, 0, 0); + + // dont need to upload! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) + // DRAW THAT this! + 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); + + displayObject.worldVisible = displayObject.visible; + + // soooooo // + // to check if any batchs exist already?? + + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(projection) +{ + PIXI.WebGLRenderer.updateTextures(); + + var gl = this.gl; + + // set the flipped matrix.. +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, PIXI.projectionMatrix); + + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + + // TODO remove this by replacing visible with getter setters.. + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + + + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable, projection); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable, projection); + } + else if(renderable instanceof PIXI.Graphics) + { + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) +{ + PIXI.WebGLRenderer.updateTextures(); + + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + +// gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // TODO - need to fold this up a bit! + + if(startBatch == endBatch) + { + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex, endIndex+1); + } + else + { + this.renderSpecial(startBatch); + } + return; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else + { + this.renderSpecial(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else + { + this.renderSpecial(renderable); + } + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else + { + this.renderSpecial(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable) +{ + if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable, projectionMatrix); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); + } + else if(renderable instanceof PIXI.Graphics) + { + if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child); + this.addDisplayObject(child); + //this.updateTexture(child); + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.updateTexture = function(displayObject) +{ + // we know this exists.. + // is it in a batch.. + // check batch length + if(displayObject.batch.length == 1) + { + // just one! this guy! so simply swap the texture + displayObject.batch.texture = displayObject.texture.baseTexture; + return; + } + + // early out! + if(displayObject.batch.texture == displayObject.texture.baseTexture)return; + + + if(displayObject.batch.head == displayObject) + { + //console.log("HEAD") + var currentBatch = displayObject.batch; + + var index = this.batchs.indexOf( currentBatch ); + var previousBatch = this.batchs[index-1]; + currentBatch.remove(displayObject); + + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousBatch.tail); + } + else + { + // add it before.. + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + this.batchs.splice(index-1, 0, batch); + } + + } + else + { + // we are 0! + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + this.batchs.splice(0, 0, batch); + } + + } + else if(displayObject.batch.tail == displayObject) + { + var currentBatch = displayObject.batch; + + var index = this.batchs.indexOf( currentBatch ); + var nextBatch = this.batchs[index+1]; + currentBatch.remove(displayObject); + + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextBatch.head); + return; + } + else + { + // add it before.. + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch); + } + + } + else + { + // we are 0! + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + this.batchs.push(batch); + } + } + else + { + // console.log("MIDDLE") + var currentBatch = displayObject.batch; + + // split the batch into 2 + // AH! dont split on the current display object as the texture is wrong! + var splitBatch = currentBatch.split(displayObject); + + // now remove the display object + splitBatch.remove(displayObject); + + var batch = PIXI.WebGLRenderer.getBatch(); + var index = this.batchs.indexOf( currentBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + if(displayObject.__renderGroup)displayObject.__renderGroup.removeDisplayObjectAndChildren(displayObject); + + // DONT htink this is needed? + // displayObject.batch = null; + + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + /* + * so now we have the next renderable and the previous renderable + * + */ + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + else if(displayObject instanceof PIXI.Graphics) + { + //displayObject.initWebGL(this); + + // add to a batch!! + //this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + //maynot have a parent + if(!nextSprite.parent)return null; + + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + //console.log(">" + nextSprite); +// console.log(">-" + this.root); + if(nextSprite == this.root || !nextSprite.parent)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + if(!previousSprite)return null; + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; +} + +/** + * @private + */ +PIXI.WebGLRenderGroup.prototype.initTilingSprite = function(sprite) +{ + var gl = this.gl; + + // make the texture tilable.. + + sprite.verticies = new Float32Array([0, 0, + sprite.width, 0, + sprite.width, sprite.height, + 0, sprite.height]); + + sprite.uvs = new Float32Array([0, 0, + 1, 0, + 1, 1, + 0, 1]); + + sprite.colors = new Float32Array([1,1,1,1]); + + sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); + + + sprite._vertexBuffer = gl.createBuffer(); + sprite._indexBuffer = gl.createBuffer(); + sprite._uvBuffer = gl.createBuffer(); + sprite._colorBuffer = gl.createBuffer(); + + gl.bindBuffer(gl.ARRAY_BUFFER, sprite._vertexBuffer); + gl.bufferData(gl.ARRAY_BUFFER, sprite.verticies, gl.STATIC_DRAW); + + gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); + gl.bufferData(gl.ARRAY_BUFFER, sprite.uvs, gl.DYNAMIC_DRAW); + + gl.bindBuffer(gl.ARRAY_BUFFER, sprite._colorBuffer); + gl.bufferData(gl.ARRAY_BUFFER, sprite.colors, gl.STATIC_DRAW); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, sprite._indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, sprite.indices, gl.STATIC_DRAW); + +// return ( (x > 0) && ((x & (x - 1)) == 0) ); + + if(sprite.texture.baseTexture._glTexture) + { + gl.bindTexture(gl.TEXTURE_2D, sprite.texture.baseTexture._glTexture); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); + sprite.texture.baseTexture._powerOf2 = true; + } + else + { + sprite.texture.baseTexture._powerOf2 = true; + } +} + +/** + * @private + */ +PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) +{ + var gl = this.gl; + var shaderProgram = PIXI.shaderProgram; +// mat + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + + + gl.useProgram(PIXI.stripShaderProgram); + + var m = PIXI.mat3.clone(strip.worldTransform); + + PIXI.mat3.transpose(m); + + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + + if(strip.blendMode == PIXI.blendModes.NORMAL) + { + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + } + else + { + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); + } + + if(!strip.dirty) + { + + gl.bindBuffer(gl.ARRAY_BUFFER, strip._vertexBuffer); + gl.bufferSubData(gl.ARRAY_BUFFER, 0, strip.verticies) + gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 0, 0); + + // update the uvs + gl.bindBuffer(gl.ARRAY_BUFFER, strip._uvBuffer); + gl.vertexAttribPointer(shaderProgram.textureCoordAttribute, 2, gl.FLOAT, false, 0, 0); + + gl.activeTexture(gl.TEXTURE0); + gl.bindTexture(gl.TEXTURE_2D, strip.texture.baseTexture._glTexture); + + gl.bindBuffer(gl.ARRAY_BUFFER, strip._colorBuffer); + gl.vertexAttribPointer(shaderProgram.colorAttribute, 1, gl.FLOAT, false, 0, 0); + + // dont need to upload! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); + + + } + else + { + strip.dirty = false; + gl.bindBuffer(gl.ARRAY_BUFFER, strip._vertexBuffer); + gl.bufferData(gl.ARRAY_BUFFER, strip.verticies, gl.STATIC_DRAW) + gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 0, 0); + + // update the uvs + gl.bindBuffer(gl.ARRAY_BUFFER, strip._uvBuffer); + gl.bufferData(gl.ARRAY_BUFFER, strip.uvs, gl.STATIC_DRAW) + gl.vertexAttribPointer(shaderProgram.textureCoordAttribute, 2, gl.FLOAT, false, 0, 0); + + gl.activeTexture(gl.TEXTURE0); + gl.bindTexture(gl.TEXTURE_2D, strip.texture.baseTexture._glTexture); + + gl.bindBuffer(gl.ARRAY_BUFFER, strip._colorBuffer); + gl.bufferData(gl.ARRAY_BUFFER, strip.colors, gl.STATIC_DRAW) + gl.vertexAttribPointer(shaderProgram.colorAttribute, 1, gl.FLOAT, false, 0, 0); + + // dont need to upload! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); + + } + //console.log(gl.TRIANGLE_STRIP); + + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); + + // gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); + + gl.useProgram(PIXI.shaderProgram); +} + + +/** + * @private + */ +PIXI.WebGLRenderGroup.prototype.renderTilingSprite = function(sprite, projectionMatrix) +{ + var gl = this.gl; + var shaderProgram = PIXI.shaderProgram; + + var tilePosition = sprite.tilePosition; + var tileScale = sprite.tileScale; + + var offsetX = tilePosition.x/sprite.texture.baseTexture.width; + var offsetY = tilePosition.y/sprite.texture.baseTexture.height; + + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; + sprite.uvs[1] = 0 - offsetY; + + sprite.uvs[2] = (1 * scaleX) -offsetX; + sprite.uvs[3] = 0 - offsetY; + + sprite.uvs[4] = (1 *scaleX) - offsetX; + sprite.uvs[5] = (1 *scaleY) - offsetY; + + sprite.uvs[6] = 0 - offsetX; + sprite.uvs[7] = (1 *scaleY) - offsetY; + + gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); + gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) + + this.renderStrip(sprite, projectionMatrix); +} + + + +/** + * @private + */ +PIXI.WebGLRenderer.prototype.initStrip = function(strip) +{ + // build the strip! + var gl = this.gl; + var shaderProgram = this.shaderProgram; + + strip._vertexBuffer = gl.createBuffer(); + strip._indexBuffer = gl.createBuffer(); + strip._uvBuffer = gl.createBuffer(); + strip._colorBuffer = gl.createBuffer(); + + gl.bindBuffer(gl.ARRAY_BUFFER, strip._vertexBuffer); + gl.bufferData(gl.ARRAY_BUFFER, strip.verticies, gl.DYNAMIC_DRAW); + + gl.bindBuffer(gl.ARRAY_BUFFER, strip._uvBuffer); + gl.bufferData(gl.ARRAY_BUFFER, strip.uvs, gl.STATIC_DRAW); + + gl.bindBuffer(gl.ARRAY_BUFFER, strip._colorBuffer); + gl.bufferData(gl.ARRAY_BUFFER, strip.colors, gl.STATIC_DRAW); + + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + +/** + * the CanvasRenderer draws the stage and all its content onto a 2d canvas. This renderer should be used for browsers that do not support webGL. + * Dont forget to add the view to your DOM or you will not see anything :) + * @class CanvasRenderer + * @constructor + * @param width {Number} the width of the canvas view + * @default 0 + * @param height {Number} the height of the canvas view + * @default 0 + * @param view {Canvas} the canvas to use as a view, optional + * @param transparent {Boolean} the transparency of the render view, default false + * @default false + * + */ +PIXI.CanvasRenderer = function(width, height, view, transparent) +{ + this.transparent = transparent; + + /** + * The width of the canvas view + * @property width + * @type Number + * @default 800 + */ + this.width = width || 800; + /** + * The height of the canvas view + * @property height + * @type Number + * @default 600 + */ + this.height = height || 600; + + this.refresh = true; + + /** + * The canvas element that the everything is drawn to + * @property view + * @type Canvas + */ + this.view = view || document.createElement( 'canvas' ); + + // hack to enable some hardware acceleration! + //this.view.style["transform"] = "translatez(0)"; + + this.view.width = this.width; + this.view.height = this.height; + this.count = 0; + + /** + * The canvas context that the everything is drawn to + * @property context + * @type Canvas 2d Context + */ + this.context = this.view.getContext("2d"); +} + +// constructor +PIXI.CanvasRenderer.constructor = PIXI.CanvasRenderer; + +/** + * Renders the stage to its canvas view + * @method render + * @param stage {Stage} the Stage element to be rendered + */ +PIXI.CanvasRenderer.prototype.render = function(stage) +{ + // update children if need be + + //stage.__childrenAdded = []; + //stage.__childrenRemoved = []; + + // update textures if need be + PIXI.texturesToUpdate = []; + PIXI.texturesToDestroy = []; + + stage.updateTransform(); + + // update the background color + if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + + this.context.setTransform(1,0,0,1,0,0); + this.context.clearRect(0, 0, this.width, this.height) + this.renderDisplayObject(stage); + //as + + // run interaction! + if(stage.interactive) + { + //need to add some events! + if(!stage._interactiveEventsAdded) + { + stage._interactiveEventsAdded = true; + stage.interactionManager.setTarget(this); + } + } + + // remove frame updates.. + if(PIXI.Texture.frameUpdates.length > 0) + { + PIXI.Texture.frameUpdates = []; + } +} + +/** + * resizes the canvas view to the specified width and height + * @param the new width of the canvas view + * @param the new height of the canvas view + */ +PIXI.CanvasRenderer.prototype.resize = function(width, height) +{ + this.width = width; + this.height = height; + + this.view.width = width; + this.view.height = height; +} + +/** + * @private + */ + +PIXI.CanvasRenderer.prototype.renderDisplayObject = function(displayObject) +{ + var transform = displayObject.worldTransform; + var context = this.context; + //context.globalCompositeOperation = "source-over" + var blit = false; + + if(!displayObject.visible)return; + + if(displayObject instanceof PIXI.Sprite) + { + var frame = displayObject.texture.frame; + + if(frame) + { + context.globalAlpha = displayObject.worldAlpha; + + // BLITZ!!! + /* + * if the rotation is 0 then we can blitz it + * meaning we dont need to do a transform and also we + * can round to the nearest round number for a little extra speed! + */ + /*if(displayObject.rotation == 0) + { + if(!blit)this.context.setTransform(1,0,0,1,0,0); + blit = true; + context.drawImage(displayObject.texture.baseTexture.image, + frame.x, + frame.y, + frame.width, + frame.height, + (transform[2]+ ((displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width) * transform[0]), + (transform[5]+ ((displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height)* transform[4]), + (displayObject.width * transform[0]), + (displayObject.height * transform[4])); + + } + else + {*/ + // blit = false; + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + + context.drawImage(displayObject.texture.baseTexture.source, + frame.x, + frame.y, + frame.width, + frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + + frame.width, + frame.height); + //} + } + } + else if(displayObject instanceof PIXI.Strip) + { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + this.renderStrip(displayObject); + } + else if(displayObject instanceof PIXI.TilingSprite) + { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + this.renderTilingSprite(displayObject); + } + else if(displayObject instanceof PIXI.CustomRenderable) + { + displayObject.renderCanvas(this); + } + else if(displayObject instanceof PIXI.Graphics) + { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + PIXI.CanvasGraphics.renderGraphics(displayObject, context); + } + + // render! + if(displayObject.children) + { + for (var i=0; i < displayObject.children.length; i++) + { + this.renderDisplayObject(displayObject.children[i]); + } + } + + this.context.setTransform(1,0,0,1,0,0); +} + +/** + * @private + */ +PIXI.CanvasRenderer.prototype.renderStripFlat = function(strip) +{ + var context = this.context; + var verticies = strip.verticies; + var uvs = strip.uvs; + + var length = verticies.length/2; + this.count++; + + context.beginPath(); + for (var i=1; i < length-2; i++) + { + + // draw some triangles! + var index = i*2; + + var x0 = verticies[index], x1 = verticies[index+2], x2 = verticies[index+4]; + var y0 = verticies[index+1], y1 = verticies[index+3], y2 = verticies[index+5]; + + context.moveTo(x0, y0); + context.lineTo(x1, y1); + context.lineTo(x2, y2); + + }; + +// context.globalCompositeOperation = 'lighter'; + context.fillStyle = "#FF0000"; + context.fill(); + context.closePath(); + //context.globalCompositeOperation = 'source-over'; +} + +/** + * @private + */ +PIXI.CanvasRenderer.prototype.renderTilingSprite = function(sprite) +{ + var context = this.context; + + if(!sprite.__tilePattern) sprite.__tilePattern = context.createPattern(sprite.texture.baseTexture.source, "repeat"); + + context.beginPath(); + + var tilePosition = sprite.tilePosition; + var tileScale = sprite.tileScale; + + // offset + context.scale(tileScale.x,tileScale.y); + context.translate(tilePosition.x, tilePosition.y); + + context.fillStyle = sprite.__tilePattern; + context.fillRect(-tilePosition.x,-tilePosition.y,sprite.width / tileScale.x, sprite.height / tileScale.y); + + context.scale(1/tileScale.x, 1/tileScale.y); + context.translate(-tilePosition.x, -tilePosition.y); + + context.closePath(); +} + + + +/** + * @private + */ +PIXI.CanvasRenderer.prototype.renderStrip = function(strip) +{ + var context = this.context; + //context.globalCompositeOperation = 'lighter'; + // draw triangles!! + var verticies = strip.verticies; + var uvs = strip.uvs; + + var length = verticies.length/2; + this.count++; + for (var i=1; i < length-2; i++) + { + + // draw some triangles! + var index = i*2; + + var x0 = verticies[index], x1 = verticies[index+2], x2 = verticies[index+4]; + var y0 = verticies[index+1], y1 = verticies[index+3], y2 = verticies[index+5]; + + var u0 = uvs[index] * strip.texture.width, u1 = uvs[index+2] * strip.texture.width, u2 = uvs[index+4]* strip.texture.width; + var v0 = uvs[index+1]* strip.texture.height, v1 = uvs[index+3] * strip.texture.height, v2 = uvs[index+5]* strip.texture.height; + + + context.save(); + context.beginPath(); + context.moveTo(x0, y0); + context.lineTo(x1, y1); + context.lineTo(x2, y2); + context.closePath(); + + // context.fillStyle = "white"//rgb(1, 1, 1,1)); + // context.fill(); + context.clip(); + + + // Compute matrix transform + var delta = u0*v1 + v0*u2 + u1*v2 - v1*u2 - v0*u1 - u0*v2; + var delta_a = x0*v1 + v0*x2 + x1*v2 - v1*x2 - v0*x1 - x0*v2; + var delta_b = u0*x1 + x0*u2 + u1*x2 - x1*u2 - x0*u1 - u0*x2; + var delta_c = u0*v1*x2 + v0*x1*u2 + x0*u1*v2 - x0*v1*u2 - v0*u1*x2 - u0*x1*v2; + var delta_d = y0*v1 + v0*y2 + y1*v2 - v1*y2 - v0*y1 - y0*v2; + var delta_e = u0*y1 + y0*u2 + u1*y2 - y1*u2 - y0*u1 - u0*y2; + var delta_f = u0*v1*y2 + v0*y1*u2 + y0*u1*v2 - y0*v1*u2 - v0*u1*y2 - u0*y1*v2; + + + + + context.transform(delta_a/delta, delta_d/delta, + delta_b/delta, delta_e/delta, + delta_c/delta, delta_f/delta); + + context.drawImage(strip.texture.baseTexture.source, 0, 0); + context.restore(); + }; + +// context.globalCompositeOperation = 'source-over'; +} + + + + + + + + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + +/** + * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. + * @class DisplayObjectContainer + * @extends DisplayObject + * @constructor + */ +PIXI.CanvasGraphics = function() +{ + +} + +// constructor + +PIXI.CanvasGraphics.renderGraphics = function(graphics, context) +{ + + for (var i=0; i < graphics.graphicsData.length; i++) + { + var data = graphics.graphicsData[i]; + var points = data.points; + + context.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); + + context.lineWidth = data.lineWidth; + context.globalAlpha = data.lineAlpha; + + if(data.type == PIXI.Graphics.POLY) + { + if(data.lineWidth <= 0)continue; + + context.beginPath(); + + context.moveTo(points[0], points[1]); + + for (var j=1; j < points.length/2; j++) + { + context.lineTo(points[j * 2], points[j * 2 + 1]); + } + + // if the first and last point are the same close the path - much neater :) + if(points[0] == points[points.length-2] && points[1] == points[points.length-1]) + { + context.closePath(); + } + + context.stroke(); + } + else if(data.type == PIXI.Graphics.RECT) + { + // TODO - need to be Undefined! + if(data.fillColor) + { + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + + context.fillRect(points[0], points[1], points[2], points[3]); + + } + if(data.lineWidth) + { + context.strokeRect(points[0], points[1], points[2], points[3]); + } + } + else if(data.type == PIXI.Graphics.CIRC) + { + // TODO - need to be Undefined! + context.beginPath(); + context.arc(points[0], points[1], points[2],0,2*Math.PI); + context.closePath(); + + if(data.fill) + { + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.stroke(); + } + } + + + }; +} + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + +/** + * The Graphics class contains a set of methods that you can use to create a primitive shapes and lines. + * @class Graphics + * @extends DisplayObjectContainer + * @constructor + */ +PIXI.Graphics = function() +{ + PIXI.DisplayObjectContainer.call( this ); + + this.renderable = true; + + this.fillAlpha = 1; + + this.lineWidth = 2; + this.lineColor = "#FF0000"; + + this.graphicsData = []; + +} + +// constructor +PIXI.Graphics.constructor = PIXI.Graphics; +PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); + +/** + * @method lineStyle + * @param lineWidth {Number} + * @param color {Number} + * @param alpha {Number} + */ +PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) +{ + this.lineWidth = lineWidth || 0; + this.lineColor = color || 0; + this.lineAlpha = (alpha == undefined) ? 1 : alpha; + + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + this.graphicsData.push(this.currentPath); +} + +/** + * @method moveTo + * @param x {Number} + * @param y {Number} + */ +PIXI.Graphics.prototype.moveTo = function(x, y) +{ + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, points:[], type:PIXI.Graphics.POLY}; + + this.currentPath.points.push(x, y); + + this.graphicsData.push(this.currentPath); +} + +/** + * @method lineTo + * @param x {Number} + * @param y {Number} + */ +PIXI.Graphics.prototype.lineTo = function(x, y) +{ + this.currentPath.points.push(x, y); + this.dirty = true; +} + +/** + * @method beginFill + * @param color {Number} + * @param alpha {Number} + */ +PIXI.Graphics.prototype.beginFill = function(color, alpha) +{ + this.filling = true; + this.fillColor = color || 0; + this.fillAlpha = alpha || 1; +} + +/** + * @method endFill + */ +PIXI.Graphics.prototype.endFill = function() +{ + this.filling = false; + this.fillColor = null; + this.fillAlpha = 1; +} + +/** + * @method drawRect + * @param x {Number} + * @param y {Number} + * @param width {Number} + * @param height {Number} + */ +PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) +{ + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.RECT}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method drawCircle + * @param x {Number} + * @param y {Number} + * @param radius {Number} + */ +PIXI.Graphics.prototype.drawCircle = function( x, y, radius) +{ + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, radius], type:PIXI.Graphics.CIRC}; + + this.graphicsData.push(this.currentPath); + this.dirty = true; +} + +/** + * @method clear + */ +PIXI.Graphics.prototype.clear = function() +{ + this.dirty = true; + this.clearDirty = true; + this.graphicsData = []; +} + +// SOME TYPES: +PIXI.Graphics.POLY = 0; +PIXI.Graphics.RECT = 1; +PIXI.Graphics.CIRC = 2; + +/** + * @author Mat Groves http://matgroves.com/ + */ + +PIXI.Strip = function(texture, width, height) +{ + PIXI.DisplayObjectContainer.call( this ); + this.texture = texture; + 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(error) + { + 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.uvs = new Float32Array() + this.verticies = new Float32Array() + this.colors = new Float32Array() + this.indices = new Uint16Array() +*/ + this.width = width; + this.height = height; + + // load the texture! + if(texture.baseTexture.hasLoaded) + { + this.width = this.texture.frame.width; + this.height = this.texture.frame.height; + this.updateFrame = true; + } + else + { + this.onTextureUpdateBind = this.onTextureUpdate.bind(this); + this.texture.addEventListener( 'update', this.onTextureUpdateBind ); + } + + this.renderable = true; +} + +// constructor +PIXI.Strip.constructor = PIXI.Strip; +PIXI.Strip.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); + +PIXI.Strip.prototype.setTexture = function(texture) +{ + //TODO SET THE TEXTURES + //TODO VISIBILITY + + // stop current texture + this.texture = texture; + this.width = texture.frame.width; + this.height = texture.frame.height; + this.updateFrame = true; +} + +PIXI.Strip.prototype.onTextureUpdate = function(event) +{ + this.updateFrame = true; +} +// some helper functions.. + + +/** + * @author Mat Groves http://matgroves.com/ + */ + + +PIXI.Rope = function(texture, points) +{ + PIXI.Strip.call( this, texture ); + this.points = points; + + try + { + this.verticies = new Float32Array( points.length * 4); + this.uvs = new Float32Array( points.length * 4); + this.colors = new Float32Array( points.length * 2); + this.indices = new Uint16Array( points.length * 2); + } + catch(error) + { + this.verticies = verticies + + this.uvs = uvs + this.colors = colors + this.indices = indices + } + + this.refresh(); +} + + +// constructor +PIXI.Rope.constructor = PIXI.Rope; +PIXI.Rope.prototype = Object.create( PIXI.Strip.prototype ); + +PIXI.Rope.prototype.refresh = function() +{ + var points = this.points; + if(points.length < 1)return; + + var uvs = this.uvs + var indices = this.indices; + var colors = this.colors; + + var lastPoint = points[0]; + var nextPoint; + var perp = {x:0, y:0}; + var point = points[0]; + + this.count-=0.2; + + + uvs[0] = 0 + uvs[1] = 1 + uvs[2] = 0 + uvs[3] = 1 + + colors[0] = 1; + colors[1] = 1; + + indices[0] = 0; + indices[1] = 1; + + var total = points.length; + + for (var i = 1; i < total; i++) + { + + var point = points[i]; + var index = i * 4; + // time to do some smart drawing! + var amount = i/(total-1) + + if(i%2) + { + uvs[index] = amount; + uvs[index+1] = 0; + + uvs[index+2] = amount + uvs[index+3] = 1 + + } + else + { + uvs[index] = amount + uvs[index+1] = 0 + + uvs[index+2] = amount + uvs[index+3] = 1 + } + + index = i * 2; + colors[index] = 1; + colors[index+1] = 1; + + index = i * 2; + indices[index] = index; + indices[index + 1] = index + 1; + + lastPoint = point; + } +} + +PIXI.Rope.prototype.updateTransform = function() +{ + + var points = this.points; + if(points.length < 1)return; + + var verticies = this.verticies + + var lastPoint = points[0]; + var nextPoint; + var perp = {x:0, y:0}; + var point = points[0]; + + this.count-=0.2; + + verticies[0] = point.x + perp.x + verticies[1] = point.y + perp.y //+ 200 + verticies[2] = point.x - perp.x + verticies[3] = point.y - perp.y//+200 + // time to do some smart drawing! + + var total = points.length; + + for (var i = 1; i < total; i++) + { + + var point = points[i]; + var index = i * 4; + + if(i < points.length-1) + { + nextPoint = points[i+1]; + } + else + { + nextPoint = point + } + + perp.y = -(nextPoint.x - lastPoint.x); + perp.x = nextPoint.y - lastPoint.y; + + var ratio = (1 - (i / (total-1))) * 10; + if(ratio > 1)ratio = 1; + + var perpLength = Math.sqrt(perp.x * perp.x + perp.y * perp.y); + var num = this.texture.height/2//(20 + Math.abs(Math.sin((i + this.count) * 0.3) * 50) )* ratio; + perp.x /= perpLength; + perp.y /= perpLength; + + perp.x *= num; + perp.y *= num; + + verticies[index] = point.x + perp.x + verticies[index+1] = point.y + perp.y + verticies[index+2] = point.x - perp.x + verticies[index+3] = point.y - perp.y + + lastPoint = point; + } + + PIXI.DisplayObjectContainer.prototype.updateTransform.call( this ); +} + +PIXI.Rope.prototype.setTexture = function(texture) +{ + // stop current texture + this.texture = texture; + this.updateFrame = true; +} + + + + + +/** + * @author Mat Groves http://matgroves.com/ + */ + +/** + * A tiling sprite is a fast way of rendering a tiling image + * @class TilingSprite + * @extends DisplayObjectContainer + * @constructor + * @param texture {Texture} the texture of the tiling sprite + * @param width {Number} the width of the tiling sprite + * @param height {Number} the height of the tiling sprite + */ +PIXI.TilingSprite = function(texture, width, height) +{ + PIXI.DisplayObjectContainer.call( this ); + + this.texture = texture; + this.width = width; + this.height = height; + this.renderable = true; + + /** + * The scaling of the image that is being tiled + * @property tileScale + * @type Point + */ + this.tileScale = new PIXI.Point(1,1); + /** + * The offset position of the image that is being tiled + * @property tilePosition + * @type Point + */ + this.tilePosition = new PIXI.Point(0,0); + + this.blendMode = PIXI.blendModes.NORMAL +} + +// constructor +PIXI.TilingSprite.constructor = PIXI.TilingSprite; +PIXI.TilingSprite.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); + +PIXI.TilingSprite.prototype.setTexture = function(texture) +{ + //TODO SET THE TEXTURES + //TODO VISIBILITY + + // stop current texture + this.texture = texture; + this.updateFrame = true; +} + +PIXI.TilingSprite.prototype.onTextureUpdate = function(event) +{ + this.updateFrame = true; +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + * based on pixi impact spine implementation made by Eemeli Kelokorpi (@ekelokorpi) https://github.com/ekelokorpi + * + * Awesome JS run time provided by EsotericSoftware + * https://github.com/EsotericSoftware/spine-runtimes + * + */ + +/** + * A class that enables the you to import and run your spine animations in pixi. + * Spine animation data needs to be loaded using the PIXI.AssetLoader or PIXI.SpineLoader before it can be used by this class + * Also due to a clash of names You will need to change the extension of the spine file from *.json to *.anim for it to load + * See example 12 (http://www.goodboydigital.com/pixijs/examples/12/) to see a working example and check out the source + * @class Spine + * @constructor + * @extends DisplayObjectContainer + * @param {String} url the url of the spine anim file to be used + */ +PIXI.Spine = function(url) +{ + PIXI.DisplayObjectContainer.call(this); + + this.spineData = PIXI.AnimCache[url]; + + if(!this.spineData) + { + throw new Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: " + url); + return; + } + + this.count = 0; + + this.sprites = []; + + this.skeleton = new spine.Skeleton(this.spineData); + this.skeleton.updateWorldTransform(); + + this.stateData = new spine.AnimationStateData(this.spineData); + this.state = new spine.AnimationState(this.stateData); + + // add the sprites.. + for (var i = 0; i < this.skeleton.drawOrder.length; i++) { + + var attachmentName = this.skeleton.drawOrder[i].data.attachmentName; + + // kind of an assumtion here. that its a png + if(!PIXI.TextureCache[attachmentName]) + { + attachmentName += ".png"; + } + + + var sprite = new PIXI.Sprite(PIXI.Texture.fromFrame(attachmentName)); + sprite.anchor.x = sprite.anchor.y = 0.5; + this.addChild(sprite); + this.sprites.push(sprite); + }; +} + +PIXI.Spine.constructor = PIXI.Spine; +PIXI.Spine.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); +PIXI.Spine.prototype.updateTransform = function() +{ + // TODO should make this time based really.. + this.state.update(1/60); + this.state.apply(this.skeleton); + this.skeleton.updateWorldTransform(); + + + for (var i = 0; i < this.skeleton.drawOrder.length; i++) + { + var slot = this.skeleton.drawOrder[i]; + + var x = slot.bone.worldX + slot.attachment.x * slot.bone.m00 + slot.attachment.y * slot.bone.m01 + slot.attachment.width * 0.5; + var y = slot.bone.worldY + slot.attachment.x * slot.bone.m10 + slot.attachment.y * slot.bone.m11 + slot.attachment.height * 0.5; + //console.log(x + ' : ' + y); + + + //console.log(slot.attachment.name) + if(slot.cacheName != slot.attachment.name) + { + var attachmentName = slot.attachment.name; + + if(!PIXI.TextureCache[attachmentName]) + { + attachmentName += ".png"; + } + + this.sprites[i].setTexture(PIXI.TextureCache[attachmentName]); + + slot.cacheName = slot.attachment.name; + } + + x += -((slot.attachment.width * (slot.bone.worldScaleX + slot.attachment.scaleX - 1))>>1); + y += -((slot.attachment.height * (slot.bone.worldScaleY + slot.attachment.scaleY - 1))>>1); + + + this.sprites[i].position.x = x; + this.sprites[i].position.y = y; + this.sprites[i].rotation = (-(slot.bone.worldRotation + slot.attachment.rotation)) * (Math.PI/180); + } + + PIXI.DisplayObjectContainer.prototype.updateTransform.call(this); +} + +/* + * Awesome JS run time provided by EsotericSoftware + * + * https://github.com/EsotericSoftware/spine-runtimes + * + */ + +var spine = {}; + +spine.BoneData = function (name, parent) { + this.name = name; + this.parent = parent; +}; +spine.BoneData.prototype = { + length: 0, + x: 0, y: 0, + rotation: 0, + scaleX: 1, scaleY: 1 +}; + +spine.SlotData = function (name, boneData) { + this.name = name; + this.boneData = boneData; +}; +spine.SlotData.prototype = { + r: 1, g: 1, b: 1, a: 1, + attachmentName: null +}; + +spine.Bone = function (boneData, parent) { + this.data = boneData; + this.parent = parent; + this.setToSetupPose(); +}; +spine.Bone.yDown = false; +spine.Bone.prototype = { + x: 0, y: 0, + rotation: 0, + scaleX: 1, scaleY: 1, + m00: 0, m01: 0, worldX: 0, // a b x + m10: 0, m11: 0, worldY: 0, // c d y + worldRotation: 0, + worldScaleX: 1, worldScaleY: 1, + updateWorldTransform: function (flipX, flipY) { + var parent = this.parent; + if (parent != null) { + this.worldX = this.x * parent.m00 + this.y * parent.m01 + parent.worldX; + this.worldY = this.x * parent.m10 + this.y * parent.m11 + parent.worldY; + this.worldScaleX = parent.worldScaleX * this.scaleX; + this.worldScaleY = parent.worldScaleY * this.scaleY; + this.worldRotation = parent.worldRotation + this.rotation; + } else { + this.worldX = this.x; + this.worldY = this.y; + this.worldScaleX = this.scaleX; + this.worldScaleY = this.scaleY; + this.worldRotation = this.rotation; + } + var radians = this.worldRotation * Math.PI / 180; + var cos = Math.cos(radians); + var sin = Math.sin(radians); + this.m00 = cos * this.worldScaleX; + this.m10 = sin * this.worldScaleX; + this.m01 = -sin * this.worldScaleY; + this.m11 = cos * this.worldScaleY; + if (flipX) { + this.m00 = -this.m00; + this.m01 = -this.m01; + } + if (flipY) { + this.m10 = -this.m10; + this.m11 = -this.m11; + } + if (spine.Bone.yDown) { + this.m10 = -this.m10; + this.m11 = -this.m11; + } + }, + setToSetupPose: function () { + var data = this.data; + this.x = data.x; + this.y = data.y; + this.rotation = data.rotation; + this.scaleX = data.scaleX; + this.scaleY = data.scaleY; + } +}; + +spine.Slot = function (slotData, skeleton, bone) { + this.data = slotData; + this.skeleton = skeleton; + this.bone = bone; + this.setToSetupPose(); +}; +spine.Slot.prototype = { + r: 1, g: 1, b: 1, a: 1, + _attachmentTime: 0, + attachment: null, + setAttachment: function (attachment) { + this.attachment = attachment; + this._attachmentTime = this.skeleton.time; + }, + setAttachmentTime: function (time) { + this._attachmentTime = this.skeleton.time - time; + }, + getAttachmentTime: function () { + return this.skeleton.time - this._attachmentTime; + }, + setToSetupPose: function () { + var data = this.data; + this.r = data.r; + this.g = data.g; + this.b = data.b; + this.a = data.a; + + var slotDatas = this.skeleton.data.slots; + for (var i = 0, n = slotDatas.length; i < n; i++) { + if (slotDatas[i] == data) { + this.setAttachment(!data.attachmentName ? null : this.skeleton.getAttachmentBySlotIndex(i, data.attachmentName)); + break; + } + } + } +}; + +spine.Skin = function (name) { + this.name = name; + this.attachments = {}; +}; +spine.Skin.prototype = { + addAttachment: function (slotIndex, name, attachment) { + this.attachments[slotIndex + ":" + name] = attachment; + }, + getAttachment: function (slotIndex, name) { + return this.attachments[slotIndex + ":" + name]; + }, + _attachAll: function (skeleton, oldSkin) { + for (var key in oldSkin.attachments) { + var colon = key.indexOf(":"); + var slotIndex = parseInt(key.substring(0, colon)); + var name = key.substring(colon + 1); + var slot = skeleton.slots[slotIndex]; + if (slot.attachment && slot.attachment.name == name) { + var attachment = this.getAttachment(slotIndex, name); + if (attachment) slot.setAttachment(attachment); + } + } + } +}; + +spine.Animation = function (name, timelines, duration) { + this.name = name; + this.timelines = timelines; + this.duration = duration; +}; +spine.Animation.prototype = { + apply: function (skeleton, time, loop) { + if (loop && this.duration != 0) time %= this.duration; + var timelines = this.timelines; + for (var i = 0, n = timelines.length; i < n; i++) + timelines[i].apply(skeleton, time, 1); + }, + mix: function (skeleton, time, loop, alpha) { + if (loop && this.duration != 0) time %= this.duration; + var timelines = this.timelines; + for (var i = 0, n = timelines.length; i < n; i++) + timelines[i].apply(skeleton, time, alpha); + } +}; + +spine.binarySearch = function (values, target, step) { + var low = 0; + var high = Math.floor(values.length / step) - 2; + if (high == 0) return step; + var current = high >>> 1; + while (true) { + if (values[(current + 1) * step] <= target) + low = current + 1; + else + high = current; + if (low == high) return (low + 1) * step; + current = (low + high) >>> 1; + } +}; +spine.linearSearch = function (values, target, step) { + for (var i = 0, last = values.length - step; i <= last; i += step) + if (values[i] > target) return i; + return -1; +}; + +spine.Curves = function (frameCount) { + this.curves = []; // dfx, dfy, ddfx, ddfy, dddfx, dddfy, ... + this.curves.length = (frameCount - 1) * 6; +}; +spine.Curves.prototype = { + setLinear: function (frameIndex) { + this.curves[frameIndex * 6] = 0/*LINEAR*/; + }, + setStepped: function (frameIndex) { + this.curves[frameIndex * 6] = -1/*STEPPED*/; + }, + /** Sets the control handle positions for an interpolation bezier curve used to transition from this keyframe to the next. + * cx1 and cx2 are from 0 to 1, representing the percent of time between the two keyframes. cy1 and cy2 are the percent of + * the difference between the keyframe's values. */ + setCurve: function (frameIndex, cx1, cy1, cx2, cy2) { + var subdiv_step = 1 / 10/*BEZIER_SEGMENTS*/; + var subdiv_step2 = subdiv_step * subdiv_step; + var subdiv_step3 = subdiv_step2 * subdiv_step; + var pre1 = 3 * subdiv_step; + var pre2 = 3 * subdiv_step2; + var pre4 = 6 * subdiv_step2; + var pre5 = 6 * subdiv_step3; + var tmp1x = -cx1 * 2 + cx2; + var tmp1y = -cy1 * 2 + cy2; + var tmp2x = (cx1 - cx2) * 3 + 1; + var tmp2y = (cy1 - cy2) * 3 + 1; + var i = frameIndex * 6; + var curves = this.curves; + curves[i] = cx1 * pre1 + tmp1x * pre2 + tmp2x * subdiv_step3; + curves[i + 1] = cy1 * pre1 + tmp1y * pre2 + tmp2y * subdiv_step3; + curves[i + 2] = tmp1x * pre4 + tmp2x * pre5; + curves[i + 3] = tmp1y * pre4 + tmp2y * pre5; + curves[i + 4] = tmp2x * pre5; + curves[i + 5] = tmp2y * pre5; + }, + getCurvePercent: function (frameIndex, percent) { + percent = percent < 0 ? 0 : (percent > 1 ? 1 : percent); + var curveIndex = frameIndex * 6; + var curves = this.curves; + var dfx = curves[curveIndex]; + if (!dfx/*LINEAR*/) return percent; + if (dfx == -1/*STEPPED*/) return 0; + var dfy = curves[curveIndex + 1]; + var ddfx = curves[curveIndex + 2]; + var ddfy = curves[curveIndex + 3]; + var dddfx = curves[curveIndex + 4]; + var dddfy = curves[curveIndex + 5]; + var x = dfx, y = dfy; + var i = 10/*BEZIER_SEGMENTS*/ - 2; + while (true) { + if (x >= percent) { + var lastX = x - dfx; + var lastY = y - dfy; + return lastY + (y - lastY) * (percent - lastX) / (x - lastX); + } + if (i == 0) break; + i--; + dfx += ddfx; + dfy += ddfy; + ddfx += dddfx; + ddfy += dddfy; + x += dfx; + y += dfy; + } + return y + (1 - y) * (percent - x) / (1 - x); // Last point is 1,1. + } +}; + +spine.RotateTimeline = function (frameCount) { + this.curves = new spine.Curves(frameCount); + this.frames = []; // time, angle, ... + this.frames.length = frameCount * 2; +}; +spine.RotateTimeline.prototype = { + boneIndex: 0, + getFrameCount: function () { + return this.frames.length / 2; + }, + setFrame: function (frameIndex, time, angle) { + frameIndex *= 2; + this.frames[frameIndex] = time; + this.frames[frameIndex + 1] = angle; + }, + apply: function (skeleton, time, alpha) { + var frames = this.frames; + if (time < frames[0]) return; // Time is before first frame. + + var bone = skeleton.bones[this.boneIndex]; + + if (time >= frames[frames.length - 2]) { // Time is after last frame. + var amount = bone.data.rotation + frames[frames.length - 1] - bone.rotation; + while (amount > 180) + amount -= 360; + while (amount < -180) + amount += 360; + bone.rotation += amount * alpha; + return; + } + + // Interpolate between the last frame and the current frame. + var frameIndex = spine.binarySearch(frames, time, 2); + var lastFrameValue = frames[frameIndex - 1]; + var frameTime = frames[frameIndex]; + var percent = 1 - (time - frameTime) / (frames[frameIndex - 2/*LAST_FRAME_TIME*/] - frameTime); + percent = this.curves.getCurvePercent(frameIndex / 2 - 1, percent); + + var amount = frames[frameIndex + 1/*FRAME_VALUE*/] - lastFrameValue; + while (amount > 180) + amount -= 360; + while (amount < -180) + amount += 360; + amount = bone.data.rotation + (lastFrameValue + amount * percent) - bone.rotation; + while (amount > 180) + amount -= 360; + while (amount < -180) + amount += 360; + bone.rotation += amount * alpha; + } +}; + +spine.TranslateTimeline = function (frameCount) { + this.curves = new spine.Curves(frameCount); + this.frames = []; // time, x, y, ... + this.frames.length = frameCount * 3; +}; +spine.TranslateTimeline.prototype = { + boneIndex: 0, + getFrameCount: function () { + return this.frames.length / 3; + }, + setFrame: function (frameIndex, time, x, y) { + frameIndex *= 3; + this.frames[frameIndex] = time; + this.frames[frameIndex + 1] = x; + this.frames[frameIndex + 2] = y; + }, + apply: function (skeleton, time, alpha) { + var frames = this.frames; + if (time < frames[0]) return; // Time is before first frame. + + var bone = skeleton.bones[this.boneIndex]; + + if (time >= frames[frames.length - 3]) { // Time is after last frame. + bone.x += (bone.data.x + frames[frames.length - 2] - bone.x) * alpha; + bone.y += (bone.data.y + frames[frames.length - 1] - bone.y) * alpha; + return; + } + + // Interpolate between the last frame and the current frame. + var frameIndex = spine.binarySearch(frames, time, 3); + var lastFrameX = frames[frameIndex - 2]; + var lastFrameY = frames[frameIndex - 1]; + var frameTime = frames[frameIndex]; + var percent = 1 - (time - frameTime) / (frames[frameIndex + -3/*LAST_FRAME_TIME*/] - frameTime); + percent = this.curves.getCurvePercent(frameIndex / 3 - 1, percent); + bone.x += (bone.data.x + lastFrameX + (frames[frameIndex + 1/*FRAME_X*/] - lastFrameX) * percent - bone.x) * alpha; + bone.y += (bone.data.y + lastFrameY + (frames[frameIndex + 2/*FRAME_Y*/] - lastFrameY) * percent - bone.y) * alpha; + } +}; + +spine.ScaleTimeline = function (frameCount) { + this.curves = new spine.Curves(frameCount); + this.frames = []; // time, x, y, ... + this.frames.length = frameCount * 3; +}; +spine.ScaleTimeline.prototype = { + boneIndex: 0, + getFrameCount: function () { + return this.frames.length / 3; + }, + setFrame: function (frameIndex, time, x, y) { + frameIndex *= 3; + this.frames[frameIndex] = time; + this.frames[frameIndex + 1] = x; + this.frames[frameIndex + 2] = y; + }, + apply: function (skeleton, time, alpha) { + var frames = this.frames; + if (time < frames[0]) return; // Time is before first frame. + + var bone = skeleton.bones[this.boneIndex]; + + if (time >= frames[frames.length - 3]) { // Time is after last frame. + bone.scaleX += (bone.data.scaleX - 1 + frames[frames.length - 2] - bone.scaleX) * alpha; + bone.scaleY += (bone.data.scaleY - 1 + frames[frames.length - 1] - bone.scaleY) * alpha; + + + return; + } + + // Interpolate between the last frame and the current frame. + var frameIndex = spine.binarySearch(frames, time, 3); + var lastFrameX = frames[frameIndex - 2]; + var lastFrameY = frames[frameIndex - 1]; + var frameTime = frames[frameIndex]; + var percent = 1 - (time - frameTime) / (frames[frameIndex + -3/*LAST_FRAME_TIME*/] - frameTime); + percent = this.curves.getCurvePercent(frameIndex / 3 - 1, percent); + + bone.scaleX += (bone.data.scaleX - 1 + lastFrameX + (frames[frameIndex + 1/*FRAME_X*/] - lastFrameX) * percent - bone.scaleX) * alpha; + bone.scaleY += (bone.data.scaleY - 1 + lastFrameY + (frames[frameIndex + 2/*FRAME_Y*/] - lastFrameY) * percent - bone.scaleY) * alpha; + } +}; + +spine.ColorTimeline = function (frameCount) { + this.curves = new spine.Curves(frameCount); + this.frames = []; // time, r, g, b, a, ... + this.frames.length = frameCount * 5; +}; +spine.ColorTimeline.prototype = { + slotIndex: 0, + getFrameCount: function () { + return this.frames.length / 2; + }, + setFrame: function (frameIndex, time, x, y) { + frameIndex *= 5; + this.frames[frameIndex] = time; + this.frames[frameIndex + 1] = r; + this.frames[frameIndex + 2] = g; + this.frames[frameIndex + 3] = b; + this.frames[frameIndex + 4] = a; + }, + apply: function (skeleton, time, alpha) { + var frames = this.frames; + if (time < frames[0]) return; // Time is before first frame. + var slot = skeleton.slots[this.slotIndex]; + + if (time >= frames[frames.length - 5]) { // Time is after last frame. + var i = frames.length - 1; + slot.r = frames[i - 3]; + slot.g = frames[i - 2]; + slot.b = frames[i - 1]; + slot.a = frames[i]; + return; + } + + // Interpolate between the last frame and the current frame. + var frameIndex = spine.binarySearch(frames, time, 5); + var lastFrameR = frames[frameIndex - 4]; + var lastFrameG = frames[frameIndex - 3]; + var lastFrameB = frames[frameIndex - 2]; + var lastFrameA = frames[frameIndex - 1]; + var frameTime = frames[frameIndex]; + var percent = 1 - (time - frameTime) / (frames[frameIndex - 5/*LAST_FRAME_TIME*/] - frameTime); + percent = this.curves.getCurvePercent(frameIndex / 5 - 1, percent); + + var r = lastFrameR + (frames[frameIndex + 1/*FRAME_R*/] - lastFrameR) * percent; + var g = lastFrameG + (frames[frameIndex + 2/*FRAME_G*/] - lastFrameG) * percent; + var b = lastFrameB + (frames[frameIndex + 3/*FRAME_B*/] - lastFrameB) * percent; + var a = lastFrameA + (frames[frameIndex + 4/*FRAME_A*/] - lastFrameA) * percent; + if (alpha < 1) { + slot.r += (r - slot.r) * alpha; + slot.g += (g - slot.g) * alpha; + slot.b += (b - slot.b) * alpha; + slot.a += (a - slot.a) * alpha; + } else { + slot.r = r; + slot.g = g; + slot.b = b; + slot.a = a; + } + } +}; + +spine.AttachmentTimeline = function (frameCount) { + this.curves = new spine.Curves(frameCount); + this.frames = []; // time, ... + this.frames.length = frameCount; + this.attachmentNames = []; // time, ... + this.attachmentNames.length = frameCount; +}; +spine.AttachmentTimeline.prototype = { + slotIndex: 0, + getFrameCount: function () { + return this.frames.length / 2; + }, + setFrame: function (frameIndex, time, attachmentName) { + this.frames[frameIndex] = time; + this.attachmentNames[frameIndex] = attachmentName; + }, + apply: function (skeleton, time, alpha) { + var frames = this.frames; + if (time < frames[0]) return; // Time is before first frame. + + var frameIndex; + if (time >= frames[frames.length - 1]) // Time is after last frame. + frameIndex = frames.length - 1; + else + frameIndex = spine.binarySearch(frames, time, 1) - 1; + + var attachmentName = this.attachmentNames[frameIndex]; + //console.log(skeleton.slots[this.slotIndex]) + + // change the name! + // skeleton.slots[this.slotIndex].attachmentName = attachmentName; + + skeleton.slots[this.slotIndex].setAttachment(!attachmentName ? null : skeleton.getAttachmentBySlotIndex(this.slotIndex, attachmentName)); + } +}; + +spine.SkeletonData = function () { + this.bones = []; + this.slots = []; + this.skins = []; + this.animations = []; +}; +spine.SkeletonData.prototype = { + defaultSkin: null, + /** @return May be null. */ + findBone: function (boneName) { + var bones = this.bones; + for (var i = 0, n = bones.length; i < n; i++) + if (bones[i].name == boneName) return bones[i]; + return null; + }, + /** @return -1 if the bone was not found. */ + findBoneIndex: function (boneName) { + var bones = this.bones; + for (var i = 0, n = bones.length; i < n; i++) + if (bones[i].name == boneName) return i; + return -1; + }, + /** @return May be null. */ + findSlot: function (slotName) { + var slots = this.slots; + for (var i = 0, n = slots.length; i < n; i++) { + if (slots[i].name == slotName) return slot[i]; + } + return null; + }, + /** @return -1 if the bone was not found. */ + findSlotIndex: function (slotName) { + var slots = this.slots; + for (var i = 0, n = slots.length; i < n; i++) + if (slots[i].name == slotName) return i; + return -1; + }, + /** @return May be null. */ + findSkin: function (skinName) { + var skins = this.skins; + for (var i = 0, n = skins.length; i < n; i++) + if (skins[i].name == skinName) return skins[i]; + return null; + }, + /** @return May be null. */ + findAnimation: function (animationName) { + var animations = this.animations; + for (var i = 0, n = animations.length; i < n; i++) + if (animations[i].name == animationName) return animations[i]; + return null; + } +}; + +spine.Skeleton = function (skeletonData) { + this.data = skeletonData; + + this.bones = []; + for (var i = 0, n = skeletonData.bones.length; i < n; i++) { + var boneData = skeletonData.bones[i]; + var parent = !boneData.parent ? null : this.bones[skeletonData.bones.indexOf(boneData.parent)]; + this.bones.push(new spine.Bone(boneData, parent)); + } + + this.slots = []; + this.drawOrder = []; + for (var i = 0, n = skeletonData.slots.length; i < n; i++) { + var slotData = skeletonData.slots[i]; + var bone = this.bones[skeletonData.bones.indexOf(slotData.boneData)]; + var slot = new spine.Slot(slotData, this, bone); + this.slots.push(slot); + this.drawOrder.push(slot); + } +}; +spine.Skeleton.prototype = { + x: 0, y: 0, + skin: null, + r: 1, g: 1, b: 1, a: 1, + time: 0, + flipX: false, flipY: false, + /** Updates the world transform for each bone. */ + updateWorldTransform: function () { + var flipX = this.flipX; + var flipY = this.flipY; + var bones = this.bones; + for (var i = 0, n = bones.length; i < n; i++) + bones[i].updateWorldTransform(flipX, flipY); + }, + /** Sets the bones and slots to their setup pose values. */ + setToSetupPose: function () { + this.setBonesToSetupPose(); + this.setSlotsToSetupPose(); + }, + setBonesToSetupPose: function () { + var bones = this.bones; + for (var i = 0, n = bones.length; i < n; i++) + bones[i].setToSetupPose(); + }, + setSlotsToSetupPose: function () { + var slots = this.slots; + for (var i = 0, n = slots.length; i < n; i++) + slots[i].setToSetupPose(i); + }, + /** @return May return null. */ + getRootBone: function () { + return this.bones.length == 0 ? null : this.bones[0]; + }, + /** @return May be null. */ + findBone: function (boneName) { + var bones = this.bones; + for (var i = 0, n = bones.length; i < n; i++) + if (bones[i].data.name == boneName) return bones[i]; + return null; + }, + /** @return -1 if the bone was not found. */ + findBoneIndex: function (boneName) { + var bones = this.bones; + for (var i = 0, n = bones.length; i < n; i++) + if (bones[i].data.name == boneName) return i; + return -1; + }, + /** @return May be null. */ + findSlot: function (slotName) { + var slots = this.slots; + for (var i = 0, n = slots.length; i < n; i++) + if (slots[i].data.name == slotName) return slots[i]; + return null; + }, + /** @return -1 if the bone was not found. */ + findSlotIndex: function (slotName) { + var slots = this.slots; + for (var i = 0, n = slots.length; i < n; i++) + if (slots[i].data.name == slotName) return i; + return -1; + }, + setSkinByName: function (skinName) { + var skin = this.data.findSkin(skinName); + if (!skin) throw "Skin not found: " + skinName; + this.setSkin(skin); + }, + /** Sets the skin used to look up attachments not found in the {@link SkeletonData#getDefaultSkin() default skin}. Attachments + * from the new skin are attached if the corresponding attachment from the old skin was attached. + * @param newSkin May be null. */ + setSkin: function (newSkin) { + if (this.skin && newSkin) newSkin._attachAll(this, this.skin); + this.skin = newSkin; + }, + /** @return May be null. */ + getAttachmentBySlotName: function (slotName, attachmentName) { + return this.getAttachmentBySlotIndex(this.data.findSlotIndex(slotName), attachmentName); + }, + /** @return May be null. */ + getAttachmentBySlotIndex: function (slotIndex, attachmentName) { + if (this.skin) { + var attachment = this.skin.getAttachment(slotIndex, attachmentName); + if (attachment) return attachment; + } + if (this.data.defaultSkin) return this.data.defaultSkin.getAttachment(slotIndex, attachmentName); + return null; + }, + /** @param attachmentName May be null. */ + setAttachment: function (slotName, attachmentName) { + var slots = this.slots; + for (var i = 0, n = slots.size; i < n; i++) { + var slot = slots[i]; + if (slot.data.name == slotName) { + var attachment = null; + if (attachmentName) { + + attachment = this.getAttachment(i, attachmentName); + if (attachment == null) throw "Attachment not found: " + attachmentName + ", for slot: " + slotName; + } + + slot.setAttachment(attachment); + return; + } + } + throw "Slot not found: " + slotName; + }, + update: function (delta) { + time += delta; + } +}; + +spine.AttachmentType = { + region: 0 +}; + +spine.RegionAttachment = function () { + this.offset = []; + this.offset.length = 8; + this.uvs = []; + this.uvs.length = 8; +}; +spine.RegionAttachment.prototype = { + x: 0, y: 0, + rotation: 0, + scaleX: 1, scaleY: 1, + width: 0, height: 0, + rendererObject: null, + regionOffsetX: 0, regionOffsetY: 0, + regionWidth: 0, regionHeight: 0, + regionOriginalWidth: 0, regionOriginalHeight: 0, + setUVs: function (u, v, u2, v2, rotate) { + var uvs = this.uvs; + if (rotate) { + uvs[2/*X2*/] = u; + uvs[3/*Y2*/] = v2; + uvs[4/*X3*/] = u; + uvs[5/*Y3*/] = v; + uvs[6/*X4*/] = u2; + uvs[7/*Y4*/] = v; + uvs[0/*X1*/] = u2; + uvs[1/*Y1*/] = v2; + } else { + uvs[0/*X1*/] = u; + uvs[1/*Y1*/] = v2; + uvs[2/*X2*/] = u; + uvs[3/*Y2*/] = v; + uvs[4/*X3*/] = u2; + uvs[5/*Y3*/] = v; + uvs[6/*X4*/] = u2; + uvs[7/*Y4*/] = v2; + } + }, + updateOffset: function () { + var regionScaleX = this.width / this.regionOriginalWidth * this.scaleX; + var regionScaleY = this.height / this.regionOriginalHeight * this.scaleY; + var localX = -this.width / 2 * this.scaleX + this.regionOffsetX * regionScaleX; + var localY = -this.height / 2 * this.scaleY + this.regionOffsetY * regionScaleY; + var localX2 = localX + this.regionWidth * regionScaleX; + var localY2 = localY + this.regionHeight * regionScaleY; + var radians = this.rotation * Math.PI / 180; + var cos = Math.cos(radians); + var sin = Math.sin(radians); + var localXCos = localX * cos + this.x; + var localXSin = localX * sin; + var localYCos = localY * cos + this.y; + var localYSin = localY * sin; + var localX2Cos = localX2 * cos + this.x; + var localX2Sin = localX2 * sin; + var localY2Cos = localY2 * cos + this.y; + var localY2Sin = localY2 * sin; + var offset = this.offset; + offset[0/*X1*/] = localXCos - localYSin; + offset[1/*Y1*/] = localYCos + localXSin; + offset[2/*X2*/] = localXCos - localY2Sin; + offset[3/*Y2*/] = localY2Cos + localXSin; + offset[4/*X3*/] = localX2Cos - localY2Sin; + offset[5/*Y3*/] = localY2Cos + localX2Sin; + offset[6/*X4*/] = localX2Cos - localYSin; + offset[7/*Y4*/] = localYCos + localX2Sin; + }, + computeVertices: function (x, y, bone, vertices) { + + x += bone.worldX; + y += bone.worldY; + var m00 = bone.m00; + var m01 = bone.m01; + var m10 = bone.m10; + var m11 = bone.m11; + var offset = this.offset; + vertices[0/*X1*/] = offset[0/*X1*/] * m00 + offset[1/*Y1*/] * m01 + x; + vertices[1/*Y1*/] = offset[0/*X1*/] * m10 + offset[1/*Y1*/] * m11 + y; + vertices[2/*X2*/] = offset[2/*X2*/] * m00 + offset[3/*Y2*/] * m01 + x; + vertices[3/*Y2*/] = offset[2/*X2*/] * m10 + offset[3/*Y2*/] * m11 + y; + vertices[4/*X3*/] = offset[4/*X3*/] * m00 + offset[5/*X3*/] * m01 + x; + vertices[5/*X3*/] = offset[4/*X3*/] * m10 + offset[5/*X3*/] * m11 + y; + vertices[6/*X4*/] = offset[6/*X4*/] * m00 + offset[7/*Y4*/] * m01 + x; + vertices[7/*Y4*/] = offset[6/*X4*/] * m10 + offset[7/*Y4*/] * m11 + y; + } +} + +spine.AnimationStateData = function (skeletonData) { + this.skeletonData = skeletonData; + this.animationToMixTime = {}; +}; +spine.AnimationStateData.prototype = { + setMixByName: function (fromName, toName, duration) { + var from = this.skeletonData.findAnimation(fromName); + if (!from) throw "Animation not found: " + fromName; + var to = this.skeletonData.findAnimation(toName); + if (!to) throw "Animation not found: " + toName; + this.setMix(from, to, duration); + }, + setMix: function (from, to, duration) { + this.animationToMixTime[from.name + ":" + to.name] = duration; + }, + getMix: function (from, to) { + var time = this.animationToMixTime[from.name + ":" + to.name]; + return time ? time : 0; + } +}; + +spine.AnimationState = function (stateData) { + this.data = stateData; + this.queue = []; +}; +spine.AnimationState.prototype = { + current: null, + previous: null, + currentTime: 0, + previousTime: 0, + currentLoop: false, + previousLoop: false, + mixTime: 0, + mixDuration: 0, + update: function (delta) { + this.currentTime += delta; + this.previousTime += delta; + this.mixTime += delta; + + if (this.queue.length > 0) { + var entry = this.queue[0]; + if (this.currentTime >= entry.delay) { + this._setAnimation(entry.animation, entry.loop); + this.queue.shift(); + } + } + }, + apply: function (skeleton) { + if (!this.current) return; + if (this.previous) { + this.previous.apply(skeleton, this.previousTime, this.previousLoop); + var alpha = this.mixTime / this.mixDuration; + if (alpha >= 1) { + alpha = 1; + this.previous = null; + } + this.current.mix(skeleton, this.currentTime, this.currentLoop, alpha); + } else + this.current.apply(skeleton, this.currentTime, this.currentLoop); + }, + clearAnimation: function () { + this.previous = null; + this.current = null; + this.queue.length = 0; + }, + _setAnimation: function (animation, loop) { + this.previous = null; + if (animation && this.current) { + this.mixDuration = this.data.getMix(this.current, animation); + if (this.mixDuration > 0) { + this.mixTime = 0; + this.previous = this.current; + this.previousTime = this.currentTime; + this.previousLoop = this.currentLoop; + } + } + this.current = animation; + this.currentLoop = loop; + this.currentTime = 0; + }, + /** @see #setAnimation(Animation, Boolean) */ + setAnimationByName: function (animationName, loop) { + var animation = this.data.skeletonData.findAnimation(animationName); + if (!animation) throw "Animation not found: " + animationName; + this.setAnimation(animation, loop); + }, + /** Set the current animation. Any queued animations are cleared and the current animation time is set to 0. + * @param animation May be null. */ + setAnimation: function (animation, loop) { + this.queue.length = 0; + this._setAnimation(animation, loop); + }, + /** @see #addAnimation(Animation, Boolean, Number) */ + addAnimationByName: function (animationName, loop, delay) { + var animation = this.data.skeletonData.findAnimation(animationName); + if (!animation) throw "Animation not found: " + animationName; + this.addAnimation(animation, loop, delay); + }, + /** Adds an animation to be played delay seconds after the current or last queued animation. + * @param delay May be <= 0 to use duration of previous animation minus any mix duration plus the negative delay. */ + addAnimation: function (animation, loop, delay) { + var entry = {}; + entry.animation = animation; + entry.loop = loop; + + if (!delay || delay <= 0) { + var previousAnimation = this.queue.length == 0 ? this.current : this.queue[this.queue.length - 1].animation; + if (previousAnimation != null) + delay = previousAnimation.duration - this.data.getMix(previousAnimation, animation) + (delay || 0); + else + delay = 0; + } + entry.delay = delay; + + this.queue.push(entry); + }, + /** Returns true if no animation is set or if the current time is greater than the animation duration, regardless of looping. */ + isComplete: function () { + return !this.current || this.currentTime >= this.current.duration; + } +}; + +spine.SkeletonJson = function (attachmentLoader) { + this.attachmentLoader = attachmentLoader; +}; +spine.SkeletonJson.prototype = { + scale: 1, + readSkeletonData: function (root) { + var skeletonData = new spine.SkeletonData(); + + // Bones. + var bones = root["bones"]; + for (var i = 0, n = bones.length; i < n; i++) { + var boneMap = bones[i]; + var parent = null; + if (boneMap["parent"]) { + parent = skeletonData.findBone(boneMap["parent"]); + if (!parent) throw "Parent bone not found: " + boneMap["parent"]; + } + var boneData = new spine.BoneData(boneMap["name"], parent); + boneData.length = (boneMap["length"] || 0) * this.scale; + boneData.x = (boneMap["x"] || 0) * this.scale; + boneData.y = (boneMap["y"] || 0) * this.scale; + boneData.rotation = (boneMap["rotation"] || 0); + boneData.scaleX = boneMap["scaleX"] || 1; + boneData.scaleY = boneMap["scaleY"] || 1; + skeletonData.bones.push(boneData); + } + + // Slots. + var slots = root["slots"]; + for (var i = 0, n = slots.length; i < n; i++) { + var slotMap = slots[i]; + var boneData = skeletonData.findBone(slotMap["bone"]); + if (!boneData) throw "Slot bone not found: " + slotMap["bone"]; + var slotData = new spine.SlotData(slotMap["name"], boneData); + + var color = slotMap["color"]; + if (color) { + slotData.r = spine.SkeletonJson.toColor(color, 0); + slotData.g = spine.SkeletonJson.toColor(color, 1); + slotData.b = spine.SkeletonJson.toColor(color, 2); + slotData.a = spine.SkeletonJson.toColor(color, 3); + } + + slotData.attachmentName = slotMap["attachment"]; + + skeletonData.slots.push(slotData); + } + + // Skins. + var skins = root["skins"]; + for (var skinName in skins) { + if (!skins.hasOwnProperty(skinName)) continue; + var skinMap = skins[skinName]; + var skin = new spine.Skin(skinName); + for (var slotName in skinMap) { + if (!skinMap.hasOwnProperty(slotName)) continue; + var slotIndex = skeletonData.findSlotIndex(slotName); + var slotEntry = skinMap[slotName]; + for (var attachmentName in slotEntry) { + if (!slotEntry.hasOwnProperty(attachmentName)) continue; + var attachment = this.readAttachment(skin, attachmentName, slotEntry[attachmentName]); + if (attachment != null) skin.addAttachment(slotIndex, attachmentName, attachment); + } + } + skeletonData.skins.push(skin); + if (skin.name == "default") skeletonData.defaultSkin = skin; + } + + // Animations. + var animations = root["animations"]; + for (var animationName in animations) { + if (!animations.hasOwnProperty(animationName)) continue; + this.readAnimation(animationName, animations[animationName], skeletonData); + } + + return skeletonData; + }, + readAttachment: function (skin, name, map) { + name = map["name"] || name; + + var type = spine.AttachmentType[map["type"] || "region"]; + + // @ekelokorpi + // var attachment = this.attachmentLoader.newAttachment(skin, type, name); + var attachment = new spine.RegionAttachment(); + + // @Doormat23 + // add the name of the attachment + attachment.name = name; + + if (type == spine.AttachmentType.region) { + attachment.x = (map["x"] || 0) * this.scale; + attachment.y = (map["y"] || 0) * this.scale; + attachment.scaleX = map["scaleX"] || 1; + attachment.scaleY = map["scaleY"] || 1; + attachment.rotation = map["rotation"] || 0; + attachment.width = (map["width"] || 32) * this.scale; + attachment.height = (map["height"] || 32) * this.scale; + attachment.updateOffset(); + } + + return attachment; + }, + readAnimation: function (name, map, skeletonData) { + var timelines = []; + var duration = 0; + + var bones = map["bones"]; + for (var boneName in bones) { + if (!bones.hasOwnProperty(boneName)) continue; + var boneIndex = skeletonData.findBoneIndex(boneName); + if (boneIndex == -1) throw "Bone not found: " + boneName; + var boneMap = bones[boneName]; + + for (var timelineName in boneMap) { + if (!boneMap.hasOwnProperty(timelineName)) continue; + var values = boneMap[timelineName]; + if (timelineName == "rotate") { + var timeline = new spine.RotateTimeline(values.length); + timeline.boneIndex = boneIndex; + + var frameIndex = 0; + for (var i = 0, n = values.length; i < n; i++) { + var valueMap = values[i]; + timeline.setFrame(frameIndex, valueMap["time"], valueMap["angle"]); + spine.SkeletonJson.readCurve(timeline, frameIndex, valueMap); + frameIndex++; + } + timelines.push(timeline); + duration = Math.max(duration, timeline.frames[timeline.getFrameCount() * 2 - 2]); + + } else if (timelineName == "translate" || timelineName == "scale") { + var timeline; + var timelineScale = 1; + if (timelineName == "scale") + timeline = new spine.ScaleTimeline(values.length); + else { + timeline = new spine.TranslateTimeline(values.length); + timelineScale = this.scale; + } + timeline.boneIndex = boneIndex; + + var frameIndex = 0; + for (var i = 0, n = values.length; i < n; i++) { + var valueMap = values[i]; + var x = (valueMap["x"] || 0) * timelineScale; + var y = (valueMap["y"] || 0) * timelineScale; + timeline.setFrame(frameIndex, valueMap["time"], x, y); + spine.SkeletonJson.readCurve(timeline, frameIndex, valueMap); + frameIndex++; + } + timelines.push(timeline); + duration = Math.max(duration, timeline.frames[timeline.getFrameCount() * 3 - 3]); + + } else + throw "Invalid timeline type for a bone: " + timelineName + " (" + boneName + ")"; + } + } + var slots = map["slots"]; + for (var slotName in slots) { + if (!slots.hasOwnProperty(slotName)) continue; + var slotMap = slots[slotName]; + var slotIndex = skeletonData.findSlotIndex(slotName); + + for (var timelineName in slotMap) { + if (!slotMap.hasOwnProperty(timelineName)) continue; + var values = slotMap[timelineName]; + if (timelineName == "color") { + var timeline = new spine.ColorTimeline(values.length); + timeline.slotIndex = slotIndex; + + var frameIndex = 0; + for (var i = 0, n = values.length; i < n; i++) { + var valueMap = values[i]; + var color = valueMap["color"]; + var r = spine.SkeletonJson.toColor(color, 0); + var g = spine.SkeletonJson.toColor(color, 1); + var b = spine.SkeletonJson.toColor(color, 2); + var a = spine.SkeletonJson.toColor(color, 3); + timeline.setFrame(frameIndex, valueMap["time"], r, g, b, a); + spine.SkeletonJson.readCurve(timeline, frameIndex, valueMap); + frameIndex++; + } + timelines.push(timeline); + duration = Math.max(duration, timeline.frames[timeline.getFrameCount() * 5 - 5]); + + } else if (timelineName == "attachment") { + var timeline = new spine.AttachmentTimeline(values.length); + timeline.slotIndex = slotIndex; + + var frameIndex = 0; + for (var i = 0, n = values.length; i < n; i++) { + var valueMap = values[i]; + timeline.setFrame(frameIndex++, valueMap["time"], valueMap["name"]); + } + timelines.push(timeline); + // PIXI FIX + duration = Math.max(duration, timeline.frames[Math.floor(timeline.getFrameCount()) - 1]); + } else + throw "Invalid timeline type for a slot: " + timelineName + " (" + slotName + ")"; + } + } + skeletonData.animations.push(new spine.Animation(name, timelines, duration)); + } +}; +spine.SkeletonJson.readCurve = function (timeline, frameIndex, valueMap) { + var curve = valueMap["curve"]; + if (!curve) return; + if (curve == "stepped") + timeline.curves.setStepped(frameIndex); + else if (curve instanceof Array) + timeline.curves.setCurve(frameIndex, curve[0], curve[1], curve[2], curve[3]); +}; +spine.SkeletonJson.toColor = function (hexString, colorIndex) { + if (hexString.length != 8) throw "Color hexidecimal length must be 8, recieved: " + hexString; + return parseInt(hexString.substring(colorIndex * 2, 2), 16) / 255; +}; + +spine.Atlas = function (atlasText, textureLoader) { + this.textureLoader = textureLoader; + this.pages = []; + this.regions = []; + + var reader = new spine.AtlasReader(atlasText); + var tuple = []; + tuple.length = 4; + var page = null; + while (true) { + var line = reader.readLine(); + if (line == null) break; + line = reader.trim(line); + if (line.length == 0) + page = null; + else if (!page) { + page = new spine.AtlasPage(); + page.name = line; + + page.format = spine.Atlas.Format[reader.readValue()]; + + reader.readTuple(tuple); + page.minFilter = spine.Atlas.TextureFilter[tuple[0]]; + page.magFilter = spine.Atlas.TextureFilter[tuple[1]]; + + var direction = reader.readValue(); + page.uWrap = spine.Atlas.TextureWrap.clampToEdge; + page.vWrap = spine.Atlas.TextureWrap.clampToEdge; + if (direction == "x") + page.uWrap = spine.Atlas.TextureWrap.repeat; + else if (direction == "y") + page.vWrap = spine.Atlas.TextureWrap.repeat; + else if (direction == "xy") + page.uWrap = page.vWrap = spine.Atlas.TextureWrap.repeat; + + textureLoader.load(page, line); + + this.pages.push(page); + + } else { + var region = new spine.AtlasRegion(); + region.name = line; + region.page = page; + + region.rotate = reader.readValue() == "true"; + + reader.readTuple(tuple); + var x = parseInt(tuple[0]); + var y = parseInt(tuple[1]); + + reader.readTuple(tuple); + var width = parseInt(tuple[0]); + var height = parseInt(tuple[1]); + + region.u = x / page.width; + region.v = y / page.height; + if (region.rotate) { + region.u2 = (x + height) / page.width; + region.v2 = (y + width) / page.height; + } else { + region.u2 = (x + width) / page.width; + region.v2 = (y + height) / page.height; + } + region.x = x; + region.y = y; + region.width = Math.abs(width); + region.height = Math.abs(height); + + if (reader.readTuple(tuple) == 4) { // split is optional + region.splits = [parseInt(tuple[0]), parseInt(tuple[1]), parseInt(tuple[2]), parseInt(tuple[3])]; + + if (reader.readTuple(tuple) == 4) { // pad is optional, but only present with splits + region.pads = [parseInt(tuple[0]), parseInt(tuple[1]), parseInt(tuple[2]), parseInt(tuple[3])]; + + reader.readTuple(tuple); + } + } + + region.originalWidth = parseInt(tuple[0]); + region.originalHeight = parseInt(tuple[1]); + + reader.readTuple(tuple); + region.offsetX = parseInt(tuple[0]); + region.offsetY = parseInt(tuple[1]); + + region.index = parseInt(reader.readValue()); + + this.regions.push(region); + } + } +}; +spine.Atlas.prototype = { + findRegion: function (name) { + var regions = this.regions; + for (var i = 0, n = regions.length; i < n; i++) + if (regions[i].name == name) return regions[i]; + return null; + }, + dispose: function () { + var pages = this.pages; + for (var i = 0, n = pages.length; i < n; i++) + this.textureLoader.unload(pages[i].rendererObject); + }, + updateUVs: function (page) { + var regions = this.regions; + for (var i = 0, n = regions.length; i < n; i++) { + var region = regions[i]; + if (region.page != page) continue; + region.u = region.x / page.width; + region.v = region.y / page.height; + if (region.rotate) { + region.u2 = (region.x + region.height) / page.width; + region.v2 = (region.y + region.width) / page.height; + } else { + region.u2 = (region.x + region.width) / page.width; + region.v2 = (region.y + region.height) / page.height; + } + } + } +}; + +spine.Atlas.Format = { + alpha: 0, + intensity: 1, + luminanceAlpha: 2, + rgb565: 3, + rgba4444: 4, + rgb888: 5, + rgba8888: 6 +}; + +spine.Atlas.TextureFilter = { + nearest: 0, + linear: 1, + mipMap: 2, + mipMapNearestNearest: 3, + mipMapLinearNearest: 4, + mipMapNearestLinear: 5, + mipMapLinearLinear: 6 +}; + +spine.Atlas.TextureWrap = { + mirroredRepeat: 0, + clampToEdge: 1, + repeat: 2 +}; + +spine.AtlasPage = function () {}; +spine.AtlasPage.prototype = { + name: null, + format: null, + minFilter: null, + magFilter: null, + uWrap: null, + vWrap: null, + rendererObject: null, + width: 0, + height: 0 +}; + +spine.AtlasRegion = function () {}; +spine.AtlasRegion.prototype = { + page: null, + name: null, + x: 0, y: 0, + width: 0, height: 0, + u: 0, v: 0, u2: 0, v2: 0, + offsetX: 0, offsetY: 0, + originalWidth: 0, originalHeight: 0, + index: 0, + rotate: false, + splits: null, + pads: null, +}; + +spine.AtlasReader = function (text) { + this.lines = text.split(/\r\n|\r|\n/); +}; +spine.AtlasReader.prototype = { + index: 0, + trim: function (value) { + return value.replace(/^\s+|\s+$/g, ""); + }, + readLine: function () { + if (this.index >= this.lines.length) return null; + return this.lines[this.index++]; + }, + readValue: function () { + var line = this.readLine(); + var colon = line.indexOf(":"); + if (colon == -1) throw "Invalid line: " + line; + return this.trim(line.substring(colon + 1)); + }, + /** Returns the number of tuple values read (2 or 4). */ + readTuple: function (tuple) { + var line = this.readLine(); + var colon = line.indexOf(":"); + if (colon == -1) throw "Invalid line: " + line; + var i = 0, lastMatch= colon + 1; + for (; i < 3; i++) { + var comma = line.indexOf(",", lastMatch); + if (comma == -1) { + if (i == 0) throw "Invalid line: " + line; + break; + } + tuple[i] = this.trim(line.substr(lastMatch, comma - lastMatch)); + lastMatch = comma + 1; + } + tuple[i] = this.trim(line.substring(lastMatch)); + return i + 1; + } +} + +spine.AtlasAttachmentLoader = function (atlas) { + this.atlas = atlas; +} +spine.AtlasAttachmentLoader.prototype = { + newAttachment: function (skin, type, name) { + switch (type) { + case spine.AttachmentType.region: + var region = this.atlas.findRegion(name); + if (!region) throw "Region not found in atlas: " + name + " (" + type + ")"; + var attachment = new spine.RegionAttachment(name); + attachment.rendererObject = region; + attachment.setUVs(region.u, region.v, region.u2, region.v2, region.rotate); + attachment.regionOffsetX = region.offsetX; + attachment.regionOffsetY = region.offsetY; + attachment.regionWidth = region.width; + attachment.regionHeight = region.height; + attachment.regionOriginalWidth = region.originalWidth; + attachment.regionOriginalHeight = region.originalHeight; + return attachment; + } + throw "Unknown attachment type: " + type; + } +} + +PIXI.AnimCache = {}; +spine.Bone.yDown = true; + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + +/** + * Need to finalize this a bit more but works! Its in but will be working on this feature properly next..:) + * @class CustomRenderable + * @extends DisplayObject + * @constructor + */ +PIXI.CustomRenderable = function() +{ + PIXI.DisplayObject.call( this ); + +} + +// constructor +PIXI.CustomRenderable.constructor = PIXI.CustomRenderable; +PIXI.CustomRenderable.prototype = Object.create( PIXI.DisplayObject.prototype ); + +PIXI.CustomRenderable.prototype.renderCanvas = function(renderer) +{ + // override! +} + + +PIXI.CustomRenderable.prototype.initWebGL = function(renderer) +{ + // override! +} + + +PIXI.CustomRenderable.prototype.renderWebGL = function(renderGroup, projectionMatrix) +{ + // not sure if both needed? but ya have for now! + // override! +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + +PIXI.BaseTextureCache = {}; +PIXI.texturesToUpdate = []; +PIXI.texturesToDestroy = []; + +/** + * A texture stores the information that represents an image. All textures have a base texture + * @class BaseTexture + * @extends EventTarget + * @constructor + * @param source {String} the source object (image or canvas) + */ +PIXI.BaseTexture = function(source) +{ + PIXI.EventTarget.call( this ); + + /* + * The url of the texture + * @property imageUrl + * @type String + */ + //this.imageUrl = source.src; + + /** + * [read only] The width of the base texture set when the image has loaded + * @property width + * @type Number + */ + this.width = 100; + /** + * [read only] The height of the base texture set when the image has loaded + * @property height + * @type Number + */ + this.height = 100; + + /** + * The source that is loaded to create the texture + * @property source + * @type Image + */ + this.source = source//new Image(); + + if(!source)return; + + if(this.source instanceof Image) + { + if(this.source.complete) + { + this.hasLoaded = true; + this.width = this.source.width; + this.height = this.source.height; + + PIXI.texturesToUpdate.push(this); + } + else + { + + var scope = this; + this.source.onload = function(){ + + scope.hasLoaded = true; + scope.width = scope.source.width; + scope.height = scope.source.height; + + // add it to somewhere... + PIXI.texturesToUpdate.push(scope); + scope.dispatchEvent( { type: 'loaded', content: scope } ); + } + // this.image.src = imageUrl; + } + } + else + { + this.hasLoaded = true; + this.width = this.source.width; + this.height = this.source.height; + + PIXI.texturesToUpdate.push(this); + } + + this._powerOf2 = false; + +} + +PIXI.BaseTexture.constructor = PIXI.BaseTexture; + +PIXI.BaseTexture.prototype.destroy = function() +{ + if(this.source instanceof Image) + { + this.source.src = null; + } + this.source = null; + PIXI.texturesToDestroy.push(this); +} + +/** + * + * Helper function that returns a base texture based on an image url + * If the image is not in the base texture cache it will be created and loaded + * @static + * @method fromImage + * @param imageUrl {String} The image url of the texture + * @return BaseTexture + */ +PIXI.BaseTexture.fromImage = function(imageUrl, crossorigin) +{ + var baseTexture = PIXI.BaseTextureCache[imageUrl]; + if(!baseTexture) + { + var image = new Image(); + if (crossorigin) + { + image.crossOrigin = ''; + } + image.src = imageUrl; + baseTexture = new PIXI.BaseTexture(image); + PIXI.BaseTextureCache[imageUrl] = baseTexture; + } + + return baseTexture; +} + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + +PIXI.TextureCache = {}; +PIXI.FrameCache = {}; + +/** + * A texture stores the information that represents an image or part of an image. It cannot be added to the display list directly. To do this use PIXI.Sprite. If no frame is provided then the whole image is used + * @class Texture + * @extends EventTarget + * @constructor + * @param baseTexture {BaseTexture} + * @param frmae {Rectangle} + */ +PIXI.Texture = function(baseTexture, frame) +{ + PIXI.EventTarget.call( this ); + + if(!frame) + { + this.noFrame = true; + frame = new PIXI.Rectangle(0,0,1,1); + } + + this.trim = new PIXI.Point(); + + if(baseTexture instanceof PIXI.Texture) + baseTexture = baseTexture.baseTexture; + + /** + * The base texture of this texture + * @property baseTexture + * @type BaseTexture + */ + this.baseTexture = baseTexture; + + + + /** + * The frame specifies the region of the base texture that this texture uses + * @property frame + * @type #Rectangle + */ + this.frame = frame; + + this.scope = this; + + if(baseTexture.hasLoaded) + { + if(this.noFrame)frame = new PIXI.Rectangle(0,0, baseTexture.width, baseTexture.height); + //console.log(frame) + + this.setFrame(frame); + } + else + { + var scope = this; + baseTexture.addEventListener( 'loaded', function(){ scope.onBaseTextureLoaded()} ); + } +} + +PIXI.Texture.constructor = PIXI.Texture; + +PIXI.Texture.prototype.onBaseTextureLoaded = function(event) +{ + var baseTexture = this.baseTexture; + baseTexture.removeEventListener( 'loaded', this.onLoaded ); + + if(this.noFrame)this.frame = new PIXI.Rectangle(0,0, baseTexture.width, baseTexture.height); + this.noFrame = false; + this.width = this.frame.width; + this.height = this.frame.height; + + this.scope.dispatchEvent( { type: 'update', content: this } ); +} + +PIXI.Texture.prototype.destroy = function(destroyBase) +{ + if(destroyBase)this.baseTexture.destroy(); +} + +/** + * Specifies the rectangle region of the baseTexture + * @method setFrame + * @param frame {Rectangle} + */ +PIXI.Texture.prototype.setFrame = function(frame) +{ + this.frame = frame; + this.width = frame.width; + this.height = frame.height; + + if(frame.x + frame.width > this.baseTexture.width || frame.y + frame.height > this.baseTexture.height) + { + throw new Error("Texture Error: frame does not fit inside the base Texture dimensions " + this); + } + + this.updateFrame = true; + + PIXI.Texture.frameUpdates.push(this); + //this.dispatchEvent( { type: 'update', content: this } ); +} + +/** + * + * Helper function that returns a texture based on an image url + * If the image is not in the texture cache it will be created and loaded + * @static + * @method fromImage + * @param imageUrl {String} The image url of the texture + * @return Texture + */ +PIXI.Texture.fromImage = function(imageUrl, crossorigin) +{ + var texture = PIXI.TextureCache[imageUrl]; + + if(!texture) + { + texture = new PIXI.Texture(PIXI.BaseTexture.fromImage(imageUrl, crossorigin)); + PIXI.TextureCache[imageUrl] = texture; + } + + return texture; +} + +/** + * + * 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 + * @method fromFrame + * @param frameId {String} The frame id of the texture + * @return Texture + */ +PIXI.Texture.fromFrame = function(frameId) +{ + var texture = PIXI.TextureCache[frameId]; + if(!texture)throw new Error("The frameId '"+ frameId +"' does not exist in the texture cache " + this); + return texture; +} + +/** + * + * Helper function that returns a texture based on a canvas element + * If the canvas is not in the texture cache it will be created and loaded + * @static + * @method fromCanvas + * @param canvas {Canvas} The canvas element source of the texture + * @return Texture + */ +PIXI.Texture.fromCanvas = function(canvas) +{ + var baseTexture = new PIXI.BaseTexture(canvas); + return new PIXI.Texture(baseTexture); +} + + +/** + * + * Adds a texture to the textureCache. + * @static + * @method addTextureToCache + * @param texture {Texture} + * @param id {String} the id that the texture will be stored against. + */ +PIXI.Texture.addTextureToCache = function(texture, id) +{ + PIXI.TextureCache[id] = texture; +} + +/** + * + * Remove a texture from the textureCache. + * @static + * @method removeTextureFromCache + * @param id {String} the id of the texture to be removed + * @return {Texture} the texture that was removed + */ +PIXI.Texture.removeTextureFromCache = function(id) +{ + var texture = PIXI.TextureCache[id] + PIXI.TextureCache[id] = null; + return texture; +} + +// this is more for webGL.. it contains updated frames.. +PIXI.Texture.frameUpdates = []; + + +/** + * @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 || 100; + this.height = height || 100; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); + + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; + + for(var i=0,j=children.length; i